多线程: 关于Callable线程的问题

Callable实现类代码如下

public class myCallable implements Callable<String> {
    @Override
    public String call() throws Exception {
        //打印1-100
        int a = 0;
        while (a <= 99) {
            a++;
            System.out.println(Thread.currentThread().getName() + "==" + a);
        }
        return "I'm fine!";
    }
}

测试类代码如下

public class threadTest {
    public static void main(String[] args) {
        //创建myCallable对象mc,myCallable实现了Callable接口
        myCallable mc = new myCallable();
        //创建FutureTask对象ft,mc为参数
        FutureTask<String> ft = new FutureTask<>(mc);
        //使用同一个ft为参数,分别创建两个Thread线程
        Thread t1 = new Thread(ft);
        Thread t2 = new Thread(ft);
        //设置线程名称
        t1.setName("线程一");
        t2.setName("线程二");
        //开启线程
        t1.start();
        t2.start();
    }
}

为什么执行的结果是: 每次只能有随机其中一个线程运行并打印结果,要么是线程一,要么是线程二,不能交替运行

其实原因就是你使用的是 FutureTask,这个任务只会执行一次,并且将结果暂存下来,在第二次执行时直接返回存储的答案。

public class Test {
  
  public static void main(String[] args) throws ExecutionException, InterruptedException {
    //创建myCallable对象mc,myCallable实现了Callable接口
    myCallable mc = new myCallable();
    //创建FutureTask对象ft,mc为参数
    // 为每个线程都创建一个 future
    FutureTask<String> ft1 = new FutureTask<>(mc);
    FutureTask<String> ft2 = new FutureTask<>(mc);
    //使用同一个ft为参数,分别创建两个Thread线程
    Thread t1 = new Thread(ft1);
    Thread t2 = new Thread(ft2);
    //设置线程名称
    t1.setName("线程一");
    t2.setName("线程二");
    //开启线程
    t1.start();
    t2.start();
  }
}

 

while (a <= 99) {

a++;

System.out.println(Thread.currentThread().getName() + "==" + a);

}

改为

while (a <= 99) {

a++;

System.out.println(Thread.currentThread().getName() + "==" + a);

try{

Thread.sleep(10);

}catch(Exception e){}

}

这样改

FutureTask<String> ft = new FutureTask<>(mc);

FutureTask<String> ft1 = new FutureTask<>(mc);

//使用同一个ft为参数,分别创建两个Thread线程

Thread t1 = new Thread(ft);

Thread t2 = new Thread(ft1);

使用同步代码块,配合notifyAll()和wait(),才能交替执行

您好,我是有问必答小助手,你的问题已经有小伙伴为您解答了问题,您看下是否解决了您的问题,可以追评进行沟通哦~

如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632

非常感谢您使用有问必答服务,为了后续更快速的帮您解决问题,现诚邀您参与有问必答体验反馈。您的建议将会运用到我们的产品优化中,希望能得到您的支持与协助!

速戳参与调研>>>https://t.csdnimg.cn/Kf0y