黑马程序员技术交流社区
标题:
多线程问题
[打印本页]
作者:
尹善波
时间:
2012-7-2 19:15
标题:
多线程问题
本帖最后由 菠菜(yinshi) 于 2012-7-2 19:17 编辑
回答别人问题时,搞得自己有了不一样的疑问?有点晕,希望得到解决
public class Exercise31 {
public static void main(String[] args) {
final Printer p=new Printer();
new Thread(){
public void run()
{
for(int i=0;i<5;i++)
p.print1();
}
}.start();
new Thread(){
public void run()
{
for(int i=0;i<5;i++)
p.print2();
}
}.start();
}
}
class Printer
{
private int turn=1;
public synchronized void print1()
{
if(turn!=1)
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
else
System.out.println(Thread.currentThread().getName()+"A");
turn=2;
this.notify();
}
public synchronized void print2()
{
if(turn!=2)
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
else//这里的加上else后为什么只能每个线程运行一次?如果去掉则可以正常输出。但是如果去掉的话if语句的范围是什么?是不是在try前和notify()后加上大括号人范围?如果是的话为什么没有输出?<font color="red">求详解</font>,上面的那个if语句的问题也是这,就不写了
System.out.println(Thread.currentThread().getName()+"B");
turn=1;
this.notify();
}
}
复制代码
作者:
李伟
时间:
2012-7-2 19:35
public synchronized void print2()
44. {
45. if(turn!=2)
46. try {
47. this.wait();
48. } catch (InterruptedException e) {
49.
50. e.printStackTrace();
51. }
52. else//这里的加上else后为什么只能每个线程运行一次?如果去掉则可以正常输出。但是如果去掉的话if语句的范围是什么?是不是在try前和notify()后加上大括号人范围?如果是的话为什么没有输出?<font color="red">求详解</font>,上面的那个if语句的问题也是这,就不写了
//
有两个线程,假设分别为A和B线程,假如A先执行,执行完后,标记turn的值改变,A线程就处于了等待状态,
这时B线程执行,B线程执行完,turn的值有改变了,这时A又开始执行,但是A是接着等待状态这个位置执行的,
如果不去掉else,则会跳过打印语句去执行改变turn值的操作,同理B线程也是这样
53. System.out.println(Thread.currentThread().getName()+"B");
54. turn=1;
55. this.notify();
56. }
作者:
周刚
时间:
2012-7-2 19:58
建议LZ写代码时,把括号对应好。这样会减少错误发生的可能性.
public class Exercise31 {
public static void main(String[] args) {
final Printer p = new Printer();
new Thread() {
public void run() {
for (int i = 0; i < 5; i++)
p.print1();
}
}.start();
new Thread() {
public void run() {
for (int i = 0; i < 5; i++)
p.print2();
}
}.start();
}
}
class Printer {
private int turn = 1;
public synchronized void print1() {
if (turn != 1) {
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
else{
System.out.println(Thread.currentThread().getName() + "A");
turn = 2;
}
this.notify();
}
public synchronized void print2() {
if (turn != 2)
{
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
else{
System.out.println(Thread.currentThread().getName() + "B");
turn = 1;
}
this.notify();
}
}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2