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