【问题标题】:How can I create a new thread only if no other threads are currently open?仅当当前没有其他线程打开时,如何创建新线程?
【发布时间】:2010-01-16 15:12:15
【问题描述】:

这段代码创建并启动一个线程:

new Thread() {
    @Override
    public void run() {
        try { player.play(); }
        catch ( Exception e ) { System.out.println(e); }
    }
}.start();

我想修改此代码,以便线程仅在当时没有其他线程打开时才启动!如果有我想关闭它们,然后启动它。

【问题讨论】:

  • (我猜是主线程除外;))

标签: java multithreading


【解决方案1】:

您可以使用Executors.newSingleThreadExecutor 方法创建一个只允许单个线程的ExecutorService。拿到单线程执行器后,就可以调用execute,带Runnable参数:

Executor executor = Executors.newSingleThreadExecutor();
executor.execute(new Runnable() { public void run() { /* do something */ } });

【讨论】:

  • 我想这就是他想要的,在任何给定时间只有 1 个该类型的线程在运行。
  • 是的,这就是我想要的,在任何给定时间只有 1 个线程运行。我只需要那个线程在后台播放音乐,而我仍然可以在前台执行任何操作。
  • 好吧,我的印象是你可以运行不同数量的其他线程,但是这个音乐播放线程可以在必要时关闭它们。这种方法的一个问题是,如果当前在 executor 中执行的线程需要很长时间,您的音乐线程将不得不等待它。
  • 除非你手动停止它,在这种情况下,我看不出有任何理由首先使用执行器。
【解决方案2】:

我的首选方法是在 play 方法上放置一个同步关键字

synchronized play()

同步方法将锁定函数,因此一次只允许一个线程执行它们。

这里有更多信息 https://docs.oracle.com/javase/tutorial/essential/concurrency/syncmeth.html

【讨论】:

    【解决方案3】:

    您可以为类(发生线程的地方)创建一个静态数据成员,每次调用该类的对象时该成员都会递增,读取它并获得启动的线程数

    【讨论】:

    • 这是个好主意,但是我将如何关闭其他线程?我不会提到他们
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-27
    • 1970-01-01
    • 1970-01-01
    • 2020-06-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多