| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1379 人关注过本帖
标题:线程!
只看楼主 加入收藏
lov
Rank: 1
等 级:新手上路
帖 子:103
专家分:0
注 册:2006-12-23
收藏
得分:0 
出现异常!怎么回事?
2007-01-18 13:38
神vLinux飘飘
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:浙江杭州
等 级:贵宾
威 望:91
帖 子:6140
专家分:217
注 册:2004-7-17
收藏
得分:0 
谁看了今天CCTV10的电视了,茅以升真的好伟大


看来楼主对wait和notify的了解还不是很清楚。帮你看看吧

淘宝杜琨
2007-01-18 14:44
禹_二
Rank: 1
等 级:新手上路
帖 子:661
专家分:0
注 册:2006-9-13
收藏
得分:0 
谢谢神!!
我对线程不熟!

2007-01-18 14:47
神vLinux飘飘
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:浙江杭州
等 级:贵宾
威 望:91
帖 子:6140
专家分:217
注 册:2004-7-17
收藏
得分:0 
/**
*
* @author vlinux
*/
public class ThreadTest {

Thread1 live41=new Thread1();
Thread2 knocker=new Thread2();

private int m=0;

public ThreadTest() {
live41.setName("live41");
knocker.setName("knocker");
live41.start();
knocker.start();
}

public static void main(String[] args) {
ThreadTest t=new ThreadTest();
}

/**
* live41
*/
class Thread1 extends Thread {
public void run() {
System.out.println( "["+this.getName()+"]:\t我在等"+knocker.getName()+"那白痴." );
synchronized( knocker ) {
try {
knocker.wait(); //等knocker那头猪
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
//live41的责任是就数数字
System.out.println("["+this.getName()+"]:\t我靠!"+knocker.getName()+"那白痴终于干完了,轮到我了.");
System.out.print("["+this.getName()+"]:\t");
for( int i=0; i<10; i++ ) {
System.out.print( i+" " );
}
System.out.println(this.getName()+"的工作完成");
}
}


/**
* knocker
*/
class Thread2 extends Thread {
public void run() {
System.out.println( "["+this.getName()+"]:\t我10秒后开始运行." );
try {
Thread.sleep(1000*10); //等待10秒....恶~
} catch (InterruptedException ex) {
ex.printStackTrace();
}
//knocker的工作就是念字母
System.out.print("["+this.getName()+"]:\t");
for( int i='a'; i<='z'; i++ ) {
System.out.print( (char)i+" " );
}
System.out.println(this.getName()+"的工作完成");
synchronized( this ) {
notify(); //通知live41,工作完成,开始干活
}
}
}

}

淘宝杜琨
2007-01-18 15:11
神vLinux飘飘
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:浙江杭州
等 级:贵宾
威 望:91
帖 子:6140
专家分:217
注 册:2004-7-17
收藏
得分:0 
总结:你想等谁,那你就必须得有谁的锁。
比如:
synchronized( knocker ) {
try {
knocker.wait(); //等knocker那头猪
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}

live41要等knocker念完字母后才能数他的数字,那么live41就必须得有knocker这个对象的锁。
synchronized( knocker ) {
// code go here
}


但是,解除等待的时候正好相反,knocker要通知live41开始工作,则必须要有自己的锁,根据这个锁来告诉live41:“你可以数数字了”。
synchronized( this ) {
notify(); //通知live41,工作完成,开始干活
}

淘宝杜琨
2007-01-18 15:16
千里冰封
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:灌水之王
等 级:版主
威 望:155
帖 子:28477
专家分:59
注 册:2006-2-26
收藏
得分:0 

不错很形象,我想加精


可惜不是你,陪我到最后
2007-01-18 15:26
无理取闹
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:53
帖 子:4264
专家分:0
注 册:2006-7-26
收藏
得分:0 
神的程序写得好

win32汇编
病毒 加密
目前兴趣所在
2007-01-18 15:43
lov
Rank: 1
等 级:新手上路
帖 子:103
专家分:0
注 册:2006-12-23
收藏
得分:0 
,非常感谢!
只是最后的地方,notify();方法怎么知道是通知的另外一个呢,如果是多个等待是否就要用notifyAll()呢!
2007-01-18 15:54
千里冰封
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:灌水之王
等 级:版主
威 望:155
帖 子:28477
专家分:59
注 册:2006-2-26
收藏
得分:0 
你只要调用了一个对象的notify方法,JVM就会去通知等待获这个对象上锁的线程,让它醒过来,如果多个线程都在等待这个对象的锁,那么你可以调用notifyAll方法

可惜不是你,陪我到最后
2007-01-18 16:01
lov
Rank: 1
等 级:新手上路
帖 子:103
专家分:0
注 册:2006-12-23
收藏
得分:0 
基本明白了!

平时说的多线程来实现一个任务,是不是就是把任务分割,让每个线程实现一部分?
2007-01-18 16:17
快速回复:线程!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.022145 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved