public class MyThread implements Runnable
{
String MyString="yes";
public void run()
{
this.MyString="no";
}public static void main(String []args)
{
MyThread t=new MyThread();
new Thread(t).start();
for(int i=0;i<10;i++)
System.out.print(t.MyString);
}
}
最好是重要的语句注释下

解决方案 »

  1.   

    //启动线程
    new Thread(t).start();
      

  2.   

    把循环时间加长点for(int i=0;i<10;i++)
    try{
    Thread.sleep(100);
    }catch(Exception e){
    }
    System.out.print(t.MyString);
    }
      

  3.   

    我的是一个yes,9个no,先打出原来的MyString,然后改变MyString,后面输出的就是no了.
      

  4.   

    应该是没有同步,我也碰到了这样的问题....可能是新线程和主线程同步比较麻烦....所以我觉得最好是开2个线程(加上主线程是3个),这样结果会准确一点....public class MyThread implements Runnable
    {
    String MyString="yes";
    public void run()
    {
    this.MyString="no";
    System.out.print(this.MyString);
    }public static void main(String []args)
    {
    MyThread t=new MyThread();
    new Thread(t).start();
    for(int i=0;i<10;i++)
    System.out.print(t.MyString);
    }
    }这样就看出来了...
      

  5.   

    有意思,是不是因为你的真实线程对象是匿名的?new Thread(t).start();——匿名线程启动,这个new Thread(t)才执行了字符串赋值
    for(int i=0;i<10;i++)
      System.out.print(t.MyString);——t这个对象根本就不是一个线程,而且也未曾被改变t对象仅仅是实现了Runnable接口的一个普通类,而Runnable接口也是仅有一个抽象方法的接口(连本地方法都不是),也就说t其实根本不是个线程,只是一个普通对象。new Thread(t)才是线程而且是个匿名的。
    看jdk api中对thread类的start方法的描述:
    “使该线程开始执行;Java 虚拟机调用该线程的 run 方法。 结果是两个线程并发地运行;当前线程(从调用返回给 start 方法)和另一个线程(执行其 run 方法)”——有点难懂,建议楼主这样试试:Thread tt = new Thread(t)
    tt.start();
    tt.join()
    .....
      

  6.   

    呵呵,我帮楼主测试完了,代码如下写即可打印no:
    public static void main(String []args) throws InterruptedException
    {
    ThreadTest t=new ThreadTest();
    //new Thread(t).start();
    Thread tt = new Thread(t);
    tt.start();
    tt.join();
    for(int i=0;i<10;i++)
    System.out.println(t.MyString);
    }
    原因是主线程main尚未结束、新线程也未真正开始。这是由于我们的代码用于测试,实际当中启动一个线程大多数是让它自己去做某件事,很少再次与它交互。
      

  7.   

    新线程和主线程是独立调度的,因此两者的运行次序关系是不可预知的,可能主循环执行完成了子线程也没有被调度过,也可能子线程先被调度,或者在主循环中任意一点被调度到,都是正确的。因此,多线程要得到正确的(或者是可预知的)结果,应该使用同步。Java 1.4 及之前:public class MyThread implements Runnable
    {
      String MyString="yes";
      Object mutex = new Object(); // 专门用于同步的对象。
      boolean updated = false; // 数据是否已经更新?  public void run()
      {
        synchronize (mutex) {
          this.MyString="no";
          updated = true; // 已经更新,无须继续等待
          mutex.notifyAll();    
        }
      }  public static void main(String []args)
      {
        MyThread t=new MyThread();
        new Thread(t).start();
        for(int i=0;i<10;i++) {
          System.out.print(t.MyString);
          if (!updated) { // 如果还没有更新,则等待更新
            synchronized (mutex) {
              mutex.wait(); // 等待新线程更新数据完毕
            }
          }
        }
      }
    }
      

  8.   

    Java 1.5 及以后可以使用 java.util.concurrent 包的相关工具。
      

  9.   

    多线程之间涉及到竞争cpu,你的电脑应该是单cpu的,所以是并发执行,所以执行哪一个线程是比较随机的。
      

  10.   

    实现implements Runnable里面有个runmain里面start来启动这个run...
      

  11.   

    7.-----------synchroized 
    线程同步一般实现implements Runnable来实现。用同步代码块synchroized(对象)来实现对象的锁定,当运行该线程时。“对象”的标志位为0。结束线程“对象”的标志为至1. 7.锁其标
    import java.lang.Thread;
    public class Text1
    {
     public static void main(String [] args)
     {
      TestThread tt=new TestThread();
      new Thread(tt).start();
        new Thread(tt).start();
          new Thread(tt).start();
            new Thread(tt).start();
     }
    }
    class TestThread implements Runnable //extends Thread
    {
     int tickets=100;
    String str=new String("");
     public void run()
     {
      while(true)
      {
       synchronized(str)//锁其标
       {
       
       if (tickets>0)
       {
        try{Thread.sleep(10);}catch(Exception e){}
        System.out.println(Thread.currentThread().getName()+"is sealing tickets"+tickets--);
       }
       }
      }
     }
    }
     
    也可以在方法前面加个synchronized那就实现同步了 public synchronized void sals()