package test;public class SyncTest { private int x;
private int y;
private void setX (int i) {x=i;}
private void setY (int i) {y=i;}
public void setXY(int i){setX(i); setY(i);}
public boolean check() {
boolean f = (x !=y);
System.out.println("x="+x+",y="+y);
return f;
}
public static void main(String[] args) {
SyncTest st = new SyncTest();
for (int i=0; i<10; i++)
{
Thread t = new Th(i, st);
t.start();
}
while (true)
{
System.out.println(st.check());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
static class Th extends Thread
{
private int i;
SyncTest st ;
public Th(int i, SyncTest st)
{
this.i = i;
this.st = st;
} @Override
public void run() {
while (true)
{
st.setXY(i);
java.util.Random random = new java.util.Random();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}}以上程序的执行结果如下:
x=1,y=1
false
x=2,y=2
false
x=4,y=4
false
x=5,y=1
false
x=1,y=1
false
x=1,y=3
false
x=7,y=7
false
x=1,y=6
false
x=6,y=0
false
x=3,y=7
false
x=7,y=7
false
不管x、y的值是什么,check方法返回的永远是false,这是为什么???
private int y;
private void setX (int i) {x=i;}
private void setY (int i) {y=i;}
public void setXY(int i){setX(i); setY(i);}
public boolean check() {
boolean f = (x !=y);
System.out.println("x="+x+",y="+y);
return f;
}
public static void main(String[] args) {
SyncTest st = new SyncTest();
for (int i=0; i<10; i++)
{
Thread t = new Th(i, st);
t.start();
}
while (true)
{
System.out.println(st.check());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
static class Th extends Thread
{
private int i;
SyncTest st ;
public Th(int i, SyncTest st)
{
this.i = i;
this.st = st;
} @Override
public void run() {
while (true)
{
st.setXY(i);
java.util.Random random = new java.util.Random();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}}以上程序的执行结果如下:
x=1,y=1
false
x=2,y=2
false
x=4,y=4
false
x=5,y=1
false
x=1,y=1
false
x=1,y=3
false
x=7,y=7
false
x=1,y=6
false
x=6,y=0
false
x=3,y=7
false
x=7,y=7
false
不管x、y的值是什么,check方法返回的永远是false,这是为什么???
解决方案 »
- swing类中表的问题
- Java 浏览网页停留的随机时间要怎么实现
- Collections.sort()与comparator 排序问题
- 想换工作,迷茫,请高人指点
- 将Class 文件编译成jar 的简单问题,请教各位大侠!
- 请教一个 System.getProperties().list()的问题
- 请教:关于JTable的一些特殊问题
- 使用jspsmart下载文件时,报错java.lang.IllegalStateException: getOutputStream() has already been called for this response
- JAVA中的异常处理的过程是怎样的?出现异常后就跳出所有的程序么?
- 1.在java编程中,查询数据库时,如何有效实现分页?要求得到查询总记录数,总页数,当前页数,当前页的所有记录信息?
- Java系统锁 支持U盘锁和密码锁两种方式(附源代码)
- 怎么避免产生相同的牌?
//这样再试一下
public void setXY(int i){
setX(i);
try{Thread.sleep(1);}catch(Exception e){e.printStackTrace();}
setY(i);
}
public synchronized void setXY(int i){setX(i); setY(i);}
public synchronized boolean check() {
线程随机执行的一种情况举例,当一个线程执行setXY,执行完setX而还未执setY的时候,CPU被收回,此时主线程调用check了先执行boolean f = (x !=y);f为false,然后CPU被收回,然后之前的线程继续执行setY,然后CPU又被收回,然后主线程继续执行System.out.println("x="+x+",y="+y);打印x和y一样,然后主线程继续执行System.out.println(st.check());打印false
这就造成了LZ的结果,所以,多线程要注意同步,协调好线程之间的处理