Java如何实现多线程同步?

现在主线程到了某个位置时创建并启动了3个子线程:t1、t2和t3,仅当t1、t2、t3都完成自己任务(比如它们都要计算1到100之和)之后主线程才能执行其下面的工作(比如... 现在主线程到了某个位置时创建并启动了3个子线程:t1、t2和t3,仅当t1、t2、t3都完成自己任务(比如它们都要计算1到100之和)之后主线程才能执行其下面的工作(比如将t1、t2和t3的运算结果加起来并输出)。请问该如何实现这个功能?

听说好像要用到wait()、notify(),但不知道如何用到上面的例子上。
展开
 我来答
knifsleep
推荐于2018-04-13 · TA获得超过702个赞
知道小有建树答主
回答量:1219
采纳率:51%
帮助的人:223万
展开全部
//解决方案-1 设置3把锁, 然后把锁们应用到所有线程中 (涉及到synchronized wait notify等, 嫌麻烦. 略)
解决方案-2 设置3个全局共享的信号标记(信号灯) + 3子线程分别占用标记1 2 3
+ 主线程轮询/等待
(简洁明快 推荐)

//解决方案-2 实现如下:
static boolean t1_done = false;
static boolean t2_done = false;
static boolean t3_done = false;

//t1------run() { ............ ; t1_done = true; }
//t2、 3: 同理,略

main () { .............;
启动t1;
启动t2;
启动t3;

//轮询 or 等待
while ( true )
if ( t1_done && t2_done && t3_done) break;
else
Thread.yield () ;
// 或 Thread.sleep(xxxx) ----若子线程运行超过100ms以上,应予考虑

//轮询结束,主线程继续工作
} //main END

have fun
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
我不是的_
2010-12-06 · TA获得超过494个赞
知道小有建树答主
回答量:88
采纳率:0%
帮助的人:44.9万
展开全部
synchronized(this){
……
}

不是这个吗?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
汐日南莘
2015-09-16 · TA获得超过1.4万个赞
知道大有可为答主
回答量:1.6万
采纳率:45%
帮助的人:7454万
展开全部
1 wait方法:
该方法属于Object的方法,wait方法的作用是使得当前调用wait方法所在部分(代码块)的线程停止执行,并释放当前获得的调用wait所在的代码块的锁,并在其他线程调用notify或者notifyAll方法时恢复到竞争锁状态(一旦获得锁就恢复执行)。
调用wait方法需要注意几点:
第一点:wait被调用的时候必须在拥有锁(即synchronized修饰的)的代码块中。
第二点:恢复执行后,从wait的下一条语句开始执行,因而wait方法总是应当在while循环中调用,以免出现恢复执行后继续执行的条件不满足却继续执行的情况。
第三点:若wait方法参数中带时间,则除了notify和notifyAll被调用能激活处于wait状态(等待状态)的线程进入锁竞争外,在其他线程中interrupt它或者参数时间到了之后,该线程也将被激活到竞争状态。
第四点:wait方法被调用的线程必须获得之前执行到wait时释放掉的锁重新获得才能够恢复执行。

2 notify方法和notifyAll方法:
notify方法通知调用了wait方法,但是尚未激活的一个线程进入线程调度队列(即进入锁竞争),注意不是立即执行。并且具体是哪一个线程不能保证。另外一点就是被唤醒的这个线程一定是在等待wait所释放的锁。
notifyAll方法则唤醒所有调用了wait方法,尚未激活的进程进入竞争队列。

3 synchronized关键字:
第一点:synchronized用来标识一个普通方法时,表示一个线程要执行该方法,必须取得该方法所在的对象的锁。
第二点:synchronized用来标识一个静态方法时,表示一个线程要执行该方法,必须获得该方法所在的类的类锁。
第三点:synchronized修饰一个代码块。类似这样:synchronized(obj) { //code.... }。表示一个线程要执行该代码块,必须获得obj的锁。这样做的目的是减小锁的粒度,保证当不同块所需的锁不冲突时不用对整个对象加锁。利用零长度的byte数组对象做obj非常经济。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式