Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • Home
  • SEARCH
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 889989
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 15, 20262026-05-15T13:39:19+00:00 2026-05-15T13:39:19+00:00

I help maintain and build on a fairly large Swing GUI, with a lot

  • 0

I help maintain and build on a fairly large Swing GUI, with a lot of complex interaction. Often I find myself fixing bugs that are the result of things getting into odd states due to some race condition somewhere else in the code.

As the code base gets large, I’ve found it’s gotten less consistent about specifying via documentation which methods have threading restrictions: most commonly, methods that must be run on the Swing EDT. Similarly, it would be useful to know and provide static awareness into which (of our custom) listeners are notified on the EDT by specification.

So it came to me that this should be something that could be easily enforced using annotations. Lo and behold, there exists at least one static analysis tool, CheckThread, that uses annotations to accomplish this. It seems to allow you to declare a method to be confined to a specific thread (most commonly the EDT), and will flag methods that try to call that method without also declaring themselves as confined to that thread.

So on the surface this just seems like a low-pain, huge-gain addition to the source and build cycle. My questions are:

  • Are there any success stories for people using CheckThread or similar libraries to enforce threading constraints? Any stories of failure? Why did it succeed/fail?
  • Is this good in theory? Are there theoretical downsides?
  • Is this good in practice? Is it worth it? What kind of value has it delivered?
  • If it works in practice, what are good tools to support this? I’ve just found CheckThread but admit I’m not entirely sure what I’m searching for to find other tools that do the same thing.

I know whether it’s right for us depends on our scenario. But I’ve never heard of people using something like this in practice, and to be honest it doesn’t seem to have taken hold much from some general browsing. So I’m wondering why.

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-15T13:39:20+00:00Added an answer on May 15, 2026 at 1:39 pm

    This answer is more focused on the theory aspect of your question.

    Fundamentally you are making an assertion: “This methods runs only under certain threads”. This assertion isn’t really different than any other assertion you might make (“The method accepts only integers less than 17 for parameter X”). Issues are

    • Where do such assertions come from?
    • Can static analyzers check them?
    • Where do you get such a static analyzer?

    Mostly such assertions have to come from the software designers, as they are the only people that know the intentions. The traditional term for this is “Design by Contract”,
    although most DBC schemes are only over the current program state (C’s assert macro) and they should really be over the programs’ past and future states (“temporal assertions”), e.,g., “This routine will allocate a block of storage, and eventually some piece of code will deallocate it”. One can build tools that try to determine hueristically what the assertions are (e.g., Engler’s assertion induction work; others have done work in this area). That’s useful, but the false positives are an issue. As practical matter, asking the designers to code such assertions doesn’t seem particularly onerous, and is really good long term documentation. Whether you code such assertions with a specific “Contract” language construct, or with an if statement (“if Debug && Not(assertion) Then Fail();”) or hide them in an annotation is really just a matter of convenience. Its nice when the language allows to code such assertions directly.

    Checking of such assertions statically is difficult. If you stick with current-state only, the static analyzer pretty much has to do full data flow analysis of your entire application, because the information needed to satisfy the assertion likely comes from data created by another part of the application. (In your case, the “inside EDT” signal has to come from analyzing the whole call graph of the application to see if there is any call-path that leads to the method from a thread which is NOT the EDT thread). If you use temporal properties, the static check pretty much needs some kind of state-space verification logic in addition; these are presently still pretty much research tools. Even with all this machinery, static analyzers generally have to be “conservative” in their anlayses; if they can’t demonstrate that something is false, they pretty much have to assume it is true, because of the halting problem.

    Where do you get such analyzers? Given all the machinery needed, they’re hard to build and so you should expect them to be rare. If somebody has built one, great. If not… as a general rule, you don’t want do this yourself from scratch. The best long-term hope is to have generic program analysis machinery available on which to build such analyzers, to amortize the cost of building all the infrastructure. (I build program analyzer tool foundations; see our DMS Software Reengineering Toolkit).

    One way to make it “easier” to build such static analyzers is to restrict the cases they handle to narrow scope, e.g., CheckThread. I’d expect CheckThread to do exactly what it presently does, and it would be unlikely to get a lot stronger.

    The reason that “assert” macros and other such dynamic “current state” checks are popular is that they can actually be implemented by a simple runtime test. That’s pretty practical. The problem here is that you may never exercise a path that leads to a failed conditions. So, for dynamic analysis, absence of detected failure is not really evidence of correctness. Still feels good.

    Bottom line: static analyzers and dynamic analyzers each have their strength.

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

I have an MFC legacy app that I help to maintain. I'm not quite
HELP! I just setup a virtual host for two sites that have a lot
Help! I have an Axis web service that is being consumed by a C#
Help me ..my page index is not working in visual studio. my page load
Help! I am using jQuery to make an AJAX call to fill in a
Help! I have a PHP (PHP 5.2.5) script on HOST1 trying to connect to
help me to manage IIS (what i am trying to do is create virtual
Help I am busy making changes to a type library in a Datasnap project.
Help me settle an argument here. Is this: SqlCommand cmd = new SqlCommand( sql
Please help! I'm really at my wits' end. My program is a little personal

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.