当前位置: 首页 > 知识库问答 >
问题:

singleThreadExecutor的可调用线程正在同步工作

红砚文
2023-03-14

我已经测试了下面的可调用示例代码

ExecutorService executorService = Executors.newSingleThreadExecutor();
Future<String> futureResMap = executorService.submit(new Callable<String>() {
    @Override
    public String call() throws Exception {
        return "thread:1";
    }
});
executorService.shutdown();
System.out.println("1");
System.out.println("2");
System.out.println("3");
System.out.println("Thread response:"+futureResMap.get());
System.out.println("4");
System.out.println("5");

并获得如下输出

1
2
3
Thread response:thread:1
4
5

这意味着可调用的单线程执行器始终同步运行。

当我尝试运行如下

ExecutorService executorService = Executors.newSingleThreadExecutor();  
executorService.execute(new Runnable() {
    @Override
    public void run() {
        System.out.println("Thread response:thread:1");
    }
});
executorService.shutdown();
System.out.println("1");
System.out.println("2");
System.out.println("3");
System.out.println("4");
System.out.println("5");

每次都提供不同的输出。

运行:1

1
2
Thread response:thread:1
3
4
5

运行2:

1
2
3
Thread response:thread:1
4
5

因此,根据我的观点,可调用单线程执行器的工作方式是同步的。Callable主要用于多线程实现。我的理解正确吗?

共有1个答案

暴阳州
2023-03-14

未来类的方法get检索任务的结果,如果不可用,则无休止地等待。

 类似资料:
  • 这是我在这里的第一篇文章,提前感谢您的宽容。 我有一个带有作业队列的线程池 工艺流程: 初始化线程池(M 个线程数) 将 N 个任务放入队列中(N 个可以是 问题是同步点。我使用计数器和互斥锁实现了一个简单的信号量:在步骤2之前,计数器用要加载的任务数初始化,当每个任务完成时,计数器递减。如果counter==0,则我从工作线程发送pthread_cond_signal,步骤4中的pthrea德_

  • 下面的代码创建了一个新的custom um < code > Thread ,并等待线程结束,直到主线程再次激活。 > < li >我不太明白它是如何工作的。为什么< code > myth read . wait();立即接到电话? < li> 为什么不改用< code>Thread.join()? 公共静态void main(String[] args) {

  • 所以我有一个代码: 所以我将线程添加到我的线程列表中,然后启动这些线程。这是MyThread类: 我想做一个程序来创建线程,将它们添加到列表中,调用它们,但是每个线程都应该等到前一个线程结束它的任务。因此输出应该如下所示: 如何使用实现这一点?我尝试了使用的不同方法,但失败了。

  • 互斥锁 条件变量 POSIX信号量

  • 多线程的使用会产生一些新的问题,主要是如何保证线程的同步执行。多线程应用程序需要使用同步对象和等待函数来实现同步。 12.2.1 为什么需要同步 由于同一进程的所有线程共享进程的虚拟地址空间,并且线程的中断是汇编语言级的,所以可能会发生两个线程同时访问同一个对象(包括全局变量、共享资源、API函数和MFC对象等)的情况,这有可能导致程序错误。例如,如果一个线程在未完成对某一大尺寸全局变量的读操作时

  • 当我尝试通过启动不同的线程来执行所有同步方法时,我在一个类中有三个同步方法,我看不到同步的输出,在对象上没有获得锁 公共类DisplayMessage{ }线程类: 公共类 MyThread 扩展了线程 { }Thread2类:公共类MyThread2扩展线程{ } 线程 3 类: 包装Synchronization.classlock; 公共类MyThread3扩展线程{ } 使用main方法生