关于java多线程的一点疑问 在网上看到的所有关于java多线程的例子都是用一个实现Runnable接口,然后用这个类实例化一个对象,然后用这个对象作为参数传递给多个Thread对象。实现了Runnable接口的这个类里面写有wait(),notify()。如果我这么写, 用一个类继承Thread,然后实例化这个类的多个对象,这些对象之间是不是不能相互wait和notify? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 这要看你怎么设计了,如果没有特殊的设计,这多个实例的wait和notify是相互独立的。wait和notify是object的方法,他们是从object继承的。 用java 写写生产者 消费者问题,哲学家问题,你会有自己的理解 的 不行的,各个对象之间是相互独立的,想要用自身的wait()和notify()方法来控制其他实例是不行的。不管是实现Runnable接口还是继承Thread类都不行,这两种方法没有本质上的区别。况且wait()和notify()也跟Thread无关,而是Object的方法。 求一个通过继承Thread,而且使用wait和notify的例子 额,我想错了,我以为你说的是构造不同的实现Runnable接口的类的对象来传给Thread的构造方法使用wait()和notify(),糊涂了。对于你说的,实例多个Thread类的子类的对象来使用wait()和notify()方法,跟实现Runnable接口是没有区别的。至于例子,你把生产者和消费者问题实现Runnable接口的例子改成继承Thread类就可以了。 package pcenshao.w_n.demo;public class Test { public static void main(String[] args) throws InterruptedException { final T t1 = new T(); t1.setName("t1"); t1.start(); T t2 = new T(){ @Override public void run() { while(true){ synchronized (t1) { t1.notify(); //唤醒在监视器上t1等待第一个线程 p("t1.nofity()"); } try { Thread.sleep(10000); } catch (InterruptedException e) { e.printStackTrace(); } } } }; t2.setName("t2"); t2.start(); } static class T extends Thread{ @Override public void run() { while(true){ p("running"); synchronized (this) { try { p("waiting for notify ..."); this.wait(); p("notified"); } catch (InterruptedException e) { e.printStackTrace(); } } } } } static void p(String s){ System.out.println("thread:" + Thread.currentThread().getName() +"," + s); }} 记事本的全选功能怎么实现?为什么只有MenuItem有效?按钮却不行? Java(Swing)拼图游戏局域网对战版(顶者有分) JAVA调用DLL的一个问题,请高手指教! JAVA.IO众多子类的疑惑~~~求助明白人 新手提问,编写函数时,何时应该抛出异常,何时应该返回false 关于多个线程数据共享的问题 各位大虾,请教一个关于批处理文件的问题 简单问题,请高手指点。 如何根据网页的地址得到该网页的属性啊?帮忙,多谢! 一个小问题?大家来帮帮我 列名 'kshj' 无效 Java实现解压文件并搜索
wait和notify是object的方法,他们是从object继承的。
对于你说的,实例多个Thread类的子类的对象来使用wait()和notify()方法,跟实现Runnable接口是没有区别的。
至于例子,你把生产者和消费者问题实现Runnable接口的例子改成继承Thread类就可以了。
final T t1 = new T();
t1.setName("t1");
t1.start();
T t2 = new T(){
@Override
public void run() {
while(true){
synchronized (t1) {
t1.notify(); //唤醒在监视器上t1等待第一个线程
p("t1.nofity()");
}
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
t2.setName("t2");
t2.start();
}
static class T extends Thread{ @Override
public void run() {
while(true){
p("running");
synchronized (this) {
try {
p("waiting for notify ...");
this.wait();
p("notified");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
static void p(String s){
System.out.println("thread:" + Thread.currentThread().getName() +"," + s);
}}