在这里ThreadTest2 是主线程,而GetThread与SetThread是两个线程.这两个线程中,SetThread是用来设置data的值,然后输出一下.而GetThread是用来输出data的值.当data的值到10后,停止输出.他们两个用object实现同步,可结果和书上的不一样,请问一下这是怎么回事,如果想实现正确的结果,应该怎么做呀,谢谢大家了.public class ThreadTest2{
int data=0;
SetThread setThread;
GetThread getThread;
Object object;
public static void main(String[] args){
ThreadTest2 threadTest2=new ThreadTest2();
threadTest2.start();
}
public ThreadTest2(){
setThread=new SetThread();
getThread=new GetThread();
object=new Object();
}
public void start(){
getThread.start();
setThread.start();
}
class SetThread extends Thread{
public void run(){
while(data!=10){
synchronized(object){
data++;
System.out.println("set data="+data);
}
}
System.out.println("SetThread exit");
}
}
class GetThread extends Thread{
public void run(){
while(data!=10){
synchronized(object){
System.out.println("1st get data="+data);
for(int i=0;i<1000;i++){}
System.out.println("2nd get data="+data);
}
}
System.out.println("getThread exit");
}
}
}正确结果:
1st get data=0
1nd get data=0
set data=1
1st get data=1
1nd get data=1
set data=2
1st get data=2
1nd get data=2
set data=3
1st get data=3
1nd get data=3
.................以此类推.
错误结果:
1st get data=0
1nd get data=0
1st get data=0
1nd get data=0
1st get data=0
1nd get data=0
1st get data=0
1nd get data=0
1st get data=0
1nd get data=0
1st get data=0
1nd get data=0
set data=1
set data=2
set data=3
set data=4
set data=5
set data=6
set data=7
set data=8
set data=9
set data=10
Set Thread exit
get Thread exit
int data=0;
SetThread setThread;
GetThread getThread;
Object object;
public static void main(String[] args){
ThreadTest2 threadTest2=new ThreadTest2();
threadTest2.start();
}
public ThreadTest2(){
setThread=new SetThread();
getThread=new GetThread();
object=new Object();
}
public void start(){
getThread.start();
setThread.start();
}
class SetThread extends Thread{
public void run(){
while(data!=10){
synchronized(object){
data++;
System.out.println("set data="+data);
}
}
System.out.println("SetThread exit");
}
}
class GetThread extends Thread{
public void run(){
while(data!=10){
synchronized(object){
System.out.println("1st get data="+data);
for(int i=0;i<1000;i++){}
System.out.println("2nd get data="+data);
}
}
System.out.println("getThread exit");
}
}
}正确结果:
1st get data=0
1nd get data=0
set data=1
1st get data=1
1nd get data=1
set data=2
1st get data=2
1nd get data=2
set data=3
1st get data=3
1nd get data=3
.................以此类推.
错误结果:
1st get data=0
1nd get data=0
1st get data=0
1nd get data=0
1st get data=0
1nd get data=0
1st get data=0
1nd get data=0
1st get data=0
1nd get data=0
1st get data=0
1nd get data=0
set data=1
set data=2
set data=3
set data=4
set data=5
set data=6
set data=7
set data=8
set data=9
set data=10
Set Thread exit
get Thread exit
定义一个标志位boolean flag
比如在SetThread里面:
while(i!=10)
{
if(flag)
wait();
else{
data++;
system.out.println(......);
flag=true;
notify();
}
}
在另一个线程里稍微改一下就行了
不好意思 :)
谢谢了.
只不过标识位不一定是boolean了,可以自己设一些有意义的值
如果用synchronized(object)方法有办法实现吗??
wait()和notify()的调用都是在synchronized(object)
里的啊!
像:
public void run(){ while(data!=10){
synchronized(object){
data++;
System.out.println("set data="+data);
}
}
System.out.println("SetThread exit");
}
}
一样通过对object锁定的方法来解决应该怎么做呢?
wait(),notify()不是很好用吗