java中用Callable创建多线程,为什么多个线程没有共享target?

xuliwenBlogs 2016-04-24 04:59:28

import java.util.Random;
import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;

public class Test {

public static void main(String[] args) {
Thr hh=new Thr();
FutureTask<String> a=new FutureTask<String>(hh);
new Thread(a,"aaa").start();//开启线程aaa
System.out.println(1);
new Thread(a,"bbb").start();//开启线程bbb
System.out.println(2);
new Thread(a,"ccc").start();//开启线程ccc
System.out.println(3);

}
}

class Thr implements Callable<String>{
int i=0;
@Override
public String call() throws Exception {
/*
* 如果线程是aaa,则执行以下代码
*/
if(Thread.currentThread().getName().equals("aaa")){
for(;i<20;i++){
System.out.println("aaa"+i);
}
System.out.println("aaa finish");
return "aaa finish";
}

/*
* 如果线程是bbb,则执行以下代码
*/
else if(Thread.currentThread().getName().equals("bbb")){
for(;i<40;i++){
System.out.println("bbb"+i);
}
System.out.println("bbb finish");
return "bbb finish";
}

/*
* 如果线程是ccc,则执行以下代码
*/
else if(Thread.currentThread().getName().equals("ccc")){
for(;i<60;i++){
System.out.println("ccc"+i);
}
System.out.println("ccc finish");
return "ccc finish";
}
return "exe failure";

}

}





输出一下结果如下
1
aaa0
aaa1
aaa2
aaa3
2
aaa4
aaa5
aaa6
3
aaa7
aaa8
aaa9
aaa10
aaa11
aaa12
aaa13
aaa14
aaa15
aaa16
aaa17
aaa18
aaa19
aaa finish


请问为什么线程bbb,ccc没有被执行呢
...全文
658 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
AK47PLUS 2018-03-23
  • 打赏
  • 举报
回复
发错链接了,哈哈 https://blog.csdn.net/imxutao/article/details/79672337
AK47PLUS 2018-03-23
  • 打赏
  • 举报
回复
跟源码可已看出,是因为共享一个对象,第一个执行start更改了对象的状态,后面两个执行到run方法时直接返回了!详细看下面这个博客 https://mp.csdn.net/postedit/79672337
qq_35321353 2016-06-15
  • 打赏
  • 举报
回复
我也遇到和楼主一样问题,希望大神给解答,楼上的回答,是创建多个target,问题是多个线程可不可以共享同一个target?
街头小贩 2016-04-25
  • 打赏
  • 举报
回复

	public static void main(String[] args) {
		// TODO Auto-generated method stub
        Thr hh=new Thr();
        //FutureTask<String> a=new FutureTask<String>(hh);
        Thread t1=new Thread(new FutureTask<String>(hh),"aaa");
        t1.start();//开启线程aaa
        System.out.println(1);
        Thread t2=new Thread(new FutureTask<String>(hh),"bbb");
        t2.start();//开启线程bbb
        System.out.println(2);
        Thread t3=new Thread(new FutureTask<String>(hh),"ccc");
        t3.start();//开启线程ccc
        System.out.println(3);
	}
街头小贩 2016-04-25
  • 打赏
  • 举报
回复
AMD x450 双核:out

1
aaa0
aaa1
aaa2
aaa3
aaa4
aaa5
aaa6
aaa7
aaa8
aaa9
aaa10
aaa11
aaa12
aaa13
aaa14
aaa15
aaa16
aaa17
aaa18
aaa19
aaa finish
2
bbb20
bbb21
bbb22
bbb23
bbb24
bbb25
bbb26
bbb27
bbb28
bbb29
bbb30
bbb31
bbb32
bbb33
bbb34
bbb35
bbb36
bbb37
bbb38
bbb39
bbb finish
ccc37
3
ccc41
ccc42
ccc43
ccc44
ccc45
ccc46
ccc47
ccc48
ccc49
ccc50
ccc51
ccc52
ccc53
ccc54
ccc55
ccc56
ccc57
ccc58
ccc59
ccc finish

67,515

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧