程序:
package debug;public class Test { /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
T1 t11 = new T1();
T2 t22 = new T2();
Thread t1 = new Thread(t11);
Thread t2 = new Thread(t22);
t1.setName("t1");
t2.setName("t2");
t1.start();
t2.start();
}}
class T1 implements Runnable{
@Override
public void run() {
// TODO Auto-generated method stub
Timer1 time = new Timer1();
time.add(Thread.currentThread().getName()); try{
Thread.sleep(1000);
}catch(InterruptedException e){
System.out.println(Thread.currentThread().getName());
} time.minus(Thread.currentThread().getName()); }
}
class T2 implements Runnable{
@Override
public void run() {
// TODO Auto-generated method stub
Timer1 time = new Timer1();
time.minus(Thread.currentThread().getName()); try{
Thread.sleep(1000);
}catch(InterruptedException e){System.out.println(Thread.currentThread().getName());} time.add(Thread.currentThread().getName()); }
}
class Timer1{
public static int num = 0;
public void add(String name){
System.out.println("before add() name: " + name +" num: " + Timer1.num);
Timer1.num += 1;
System.out.println("after add() name: " + name +" num: " + Timer1.num);
System.out.println("name: " + name +" num: " + Timer1.num);
}
public void minus(String name){
System.out.println("before minus() name: " + name +" num: " + Timer1.num);
Timer1.num -= 1;
System.out.println("after minus() name: " + name +" num: " + Timer1.num);
System.out.println("name: " + name +" num: " + Timer1.num);
}
}运行结果一:
before minus() name: t2 num: 0
after minus() name: t2 num: -1 //这里进行了减法
name: t2 num: -1
before add() name: t1 num: 0 //怎么变成0了呢
after add() name: t1 num: 0 //加了之后,怎么还是0
name: t1 num: 0
before add() name: t2 num: 0
after add() name: t2 num: 1
name: t2 num: 1
before minus() name: t1 num: 0 // 不懂怎么变成0了呢
after minus() name: t1 num: 0 // 减了之后,怎么还是0
name: t1 num: 0本人刚接触JAVA的线程,运行的结果,跟自己想的有些出入,请各位指点一二,在此谢谢了!
package debug;public class Test { /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
T1 t11 = new T1();
T2 t22 = new T2();
Thread t1 = new Thread(t11);
Thread t2 = new Thread(t22);
t1.setName("t1");
t2.setName("t2");
t1.start();
t2.start();
}}
class T1 implements Runnable{
@Override
public void run() {
// TODO Auto-generated method stub
Timer1 time = new Timer1();
time.add(Thread.currentThread().getName()); try{
Thread.sleep(1000);
}catch(InterruptedException e){
System.out.println(Thread.currentThread().getName());
} time.minus(Thread.currentThread().getName()); }
}
class T2 implements Runnable{
@Override
public void run() {
// TODO Auto-generated method stub
Timer1 time = new Timer1();
time.minus(Thread.currentThread().getName()); try{
Thread.sleep(1000);
}catch(InterruptedException e){System.out.println(Thread.currentThread().getName());} time.add(Thread.currentThread().getName()); }
}
class Timer1{
public static int num = 0;
public void add(String name){
System.out.println("before add() name: " + name +" num: " + Timer1.num);
Timer1.num += 1;
System.out.println("after add() name: " + name +" num: " + Timer1.num);
System.out.println("name: " + name +" num: " + Timer1.num);
}
public void minus(String name){
System.out.println("before minus() name: " + name +" num: " + Timer1.num);
Timer1.num -= 1;
System.out.println("after minus() name: " + name +" num: " + Timer1.num);
System.out.println("name: " + name +" num: " + Timer1.num);
}
}运行结果一:
before minus() name: t2 num: 0
after minus() name: t2 num: -1 //这里进行了减法
name: t2 num: -1
before add() name: t1 num: 0 //怎么变成0了呢
after add() name: t1 num: 0 //加了之后,怎么还是0
name: t1 num: 0
before add() name: t2 num: 0
after add() name: t2 num: 1
name: t2 num: 1
before minus() name: t1 num: 0 // 不懂怎么变成0了呢
after minus() name: t1 num: 0 // 减了之后,怎么还是0
name: t1 num: 0本人刚接触JAVA的线程,运行的结果,跟自己想的有些出入,请各位指点一二,在此谢谢了!
情况是随机的before minus() name: t2 num: 0
after minus() name: t2 num: -1两个输出之间有其他的线程运行num值是不停的变化滴没有稳定结果比如我运行的结果是before add() name: t1 num: 0
after add() name: t1 num: 1
name: t1 num: 1
before minus() name: t2 num: 0
after minus() name: t2 num: 0
name: t2 num: 0
before add() name: t2 num: 0
after add() name: t2 num: 1
name: t2 num: 1
before minus() name: t1 num: 0
after minus() name: t1 num: 0
name: t1 num: 0要想有稳定的结果你的做同步呵呵
public static void main(String[] args) {
T1 t11 = new T1();
T2 t22 = new T2();
Thread t1 = new Thread(t11);
Thread t2 = new Thread(t22);
t1.setName("t1");
t2.setName("t2"); t1.start();
t2.start();
}}class T1 implements Runnable { @Override
public void run() {
Timer1 time = new Timer1();
time.add(Thread.currentThread().getName()); try {
Thread.sleep(1000);
} catch (InterruptedException e) {
System.out.println(Thread.currentThread().getName());
} time.minus(Thread.currentThread().getName()); }
}class T2 implements Runnable { @Override
public void run() {
Timer1 time = new Timer1();
time.minus(Thread.currentThread().getName()); try {
Thread.sleep(1000);
} catch (InterruptedException e) {
System.out.println(Thread.currentThread().getName());
} time.add(Thread.currentThread().getName()); }}class Timer1 {
public static int num = 0; // 使用synchronized关键字,表示add和minus不能被同时调用,只能按顺序调用
synchronized public void add(String name) {
System.out.println("before add() name: " + name + " num: " + Timer1.num);
Timer1.num += 1;
System.out.println("after add() name: " + name + " num: " + Timer1.num);
System.out.println("name: " + name + " num: " + Timer1.num);
} synchronized public void minus(String name) {
System.out.println("before minus() name: " + name + " num: " + Timer1.num);
Timer1.num -= 1;
System.out.println("after minus() name: " + name + " num: " + Timer1.num);
System.out.println("name: " + name + " num: " + Timer1.num);
}
}
首先t2取得执行权:
before minus() name: t2 num: 0
after minus() name: t2 num: -1 //这里进行了减法
name: t2 num: -1
这里t2线程sleep(), 数据区里的num值为-1
关键是下面这个输出,前面t2线程在sleep(),对num的值就没有影响了,下面执行t1线程的时候,怎么数据区里的num就变成0了呢?
before add() name: t1 num: 0 //怎么变成0了呢
这中间执行了加法,怎么数据区的num值还是0?
after add() name: t1 num: 0 //加了之后,怎么还是0
处理这个要用 synchronized ,否则t1,t2 会疯抢CPU的运行时间片儿,致使num的值不一样,这时就要用线程同步了.
public static int num = 0;
public synchronized void add(String name){
System.out.println("before add() name: " + name +" num: " + Timer1.num);
Timer1.num += 1;
System.out.println("after add() name: " + name +" num: " + Timer1.num);
System.out.println("name: " + name +" num: " + Timer1.num);
}
public synchronized void minus(String name){
System.out.println("before minus() name: " + name +" num: " + Timer1.num);
Timer1.num -= 1;
System.out.println("after minus() name: " + name +" num: " + Timer1.num);
System.out.println("name: " + name +" num: " + Timer1.num);
}
}