我和孙鑫的运行结果不一样
public class MyThread
{
int j=0;
private class InnerThread extends Thread
{
public void run()
{
while(true)
{
System.out.println(Thread.currentThread().getName()+"\t"+j++);
}
}
}
public Thread getThread()
{
return new InnerThread();
}
}public class Processtest {
public static void main(String[] args)
{
MyThread mt=new MyThread();
mt.getThread().start();
mt.getThread().start();
mt.getThread().start();
mt.getThread().start();
while(true)
{
System.out.println(Thread.currentThread().getName());
} }}孙鑫的结果是不同线程间的打印出来的序号是连续的,因为他们共享同一个变量j, 可是我运行结果是相同线程序号连续,不同线程的序号不连续(用实现runnable接口的方法也不行).我实在想不明白为什么了,求高手赐教.多谢.
public class MyThread
{
int j=0;
private class InnerThread extends Thread
{
public void run()
{
while(true)
{
System.out.println(Thread.currentThread().getName()+"\t"+j++);
}
}
}
public Thread getThread()
{
return new InnerThread();
}
}public class Processtest {
public static void main(String[] args)
{
MyThread mt=new MyThread();
mt.getThread().start();
mt.getThread().start();
mt.getThread().start();
mt.getThread().start();
while(true)
{
System.out.println(Thread.currentThread().getName());
} }}孙鑫的结果是不同线程间的打印出来的序号是连续的,因为他们共享同一个变量j, 可是我运行结果是相同线程序号连续,不同线程的序号不连续(用实现runnable接口的方法也不行).我实在想不明白为什么了,求高手赐教.多谢.
System.out.println(Thread.currentThread().getName()+"\t"+j++);这个句子有可能只执行了部分,然后就切换到了另一个线程。
这样就会出现偶尔有序号不连续的情况。你可以试试对这里加锁,看结果如何。
不管是不是同一个线程,都有可能序号不连续.
原因是:打印的问题
你这里有5个线程,我们假设仅仅有2个线程并且把它们分别记作Thread-0,Thread-1.
我们来模拟下一种情况:
Thread-0:执行完毕System.out.println(Thread.currentThread().getName()+"\t"+j++);此时打印出:Thread-0 0
Thread-1:执行完毕Thread.currentThread().getName()+"\t"+j++;但没有执行System.out.println(),此时没有任何打印.此时j=2
Thread-0:执行完毕System.out.println(Thread.currentThread().getName()+"\t"+j++);此时打印出:Thread-0 2
Thread-1:执行完毕System.out.println();此时打印出:Thread-1 1
以上情形就说明不管是不是同一个线程,都有可能序号不连续.如果按照1楼说的加锁,那么打印出的就都连续.