我和孙鑫的运行结果不一样
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接口的方法也不行).我实在想不明白为什么了,求高手赐教.多谢.

解决方案 »

  1.   

    这个要看情况的,
    System.out.println(Thread.currentThread().getName()+"\t"+j++);这个句子有可能只执行了部分,然后就切换到了另一个线程。
    这样就会出现偶尔有序号不连续的情况。你可以试试对这里加锁,看结果如何。
      

  2.   

    他的意思可能是这样。那些线程是公用j的,号所以连续的,这个连续不是控制台上表现的那样是否连续,是说控制台中出现的数字是不重复的,也就是共用j,不会每个线程都有自己的j,线程可以切换所以不肯能输出连续。
      

  3.   

    是这样的:
    不管是不是同一个线程,都有可能序号不连续.
    原因是:打印的问题
    你这里有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楼说的加锁,那么打印出的就都连续.