JAVA:我可以只执行一个线程创建吗?

JAVA:我可以只执行一个线程创建吗?,java,multithreading,singleton,Java,Multithreading,Singleton,有没有办法只强制执行线程对象的一次执行? 类似于线程单例的东西 说明,考虑下面的例子: 我有一个可运行的实现类 我希望我能够只调用对象的一次start()方法 您可以将布尔值作为属性来检查线程是否已经启动在可运行中添加一个静态布尔字段,并在运行方法开始时检查它,如下所示: synchronized(MyRunnable.class) { if(alreadyRan) { return; } alreadyRan = true; } 好吧,根据我朋友在这条

有没有办法只强制执行线程对象的一次执行? 类似于线程单例的东西

说明,考虑下面的例子:

  • 我有一个可运行的实现类
  • 我希望我能够只调用对象的一次start()方法

  • 您可以将布尔值作为属性来检查线程是否已经启动

    可运行
    中添加一个
    静态
    布尔
    字段,并在
    运行
    方法开始时检查它,如下所示:

    synchronized(MyRunnable.class) {
        if(alreadyRan) {
            return;
        }
        alreadyRan = true;
    }
    

    好吧,根据我朋友在这条帖子中的提示,我得出以下结论:

    public class TestThread extends Thread {
    
        static private TestThread _instance = null;
    
        private TestThread() {}
    
        public static TestThread getThread(){
    
            if(_instance == null)
                _instance = new TestThread();
    
            return _instance;
        }
    
        @Override
        public void run()
        {
            System.out.println("Hello");
        }
    
    }
    
    这是一个使用它的示例,当第二次调用start时抛出一个异常:

    public class Main {
    
        public static void main(String[] args) {
    
            try {
                TestThread.getThread().start();
                TestThread.getThread().start();
            } catch (IllegalThreadStateException e) {
                System.out.println("Error: Tried to start more than one instance of this thread!");
                e.printStackTrace();
            }
    
        }
    
    }
    

    欢迎您的评论。

    当您再次调用
    start()
    时,您希望看到什么?它会失败还是重新启动同一个线程?java.util.concurrent.Executors.newSingleThreadExecutor()为什么不使用它???@ahmadwabi fall忽略调用。您可以扩展线程,而不是实现Runnable。根据定义,这只是1次启动。如果没有选择,你必须按照答案中的建议引入一个标志。@john我不反对:)。我会检查的。是的,我希望有一个更具语言结构的解决方案。Thanks@dushkin您只能调用Thread.start()一次,所以不清楚您在问什么。@PeterLawrey我想问题是,OP并没有扩展Thread,而是实现Runnable。你可以让同一个实例(实现Runnable的类的)由两个线程运行,对吧…@PeterLawrey当然我只能调用它一次。但是我愿意再次调用它来对抗只需要执行一个线程的系统架构。我正在寻找一个类似于单例的解决方案。@dushkin如果您不想多次调用它,我不清楚为什么要多次调用它。这里的同步范围有点宽,是吗?@Fildor可以使用
    原子布尔
    来代替
    同步
    布尔
    但我不认为这有什么问题我不同意这个静态标志。这意味着您只能运行该类的一个实例?我真的怀疑这是要求。正如我所读到的,OP希望一个实例只能运行一次。@Fildor对此没有异议,但这取决于需求,并且OP并没有明确说明