初学线程请大家讲解下 (结贴迅速)

zbl0201 2007-11-18 09:48:57

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);
}
}




最好是重要的语句注释下
...全文
154 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
hyzhx 2007-11-19
  • 打赏
  • 举报
回复
多线程之间涉及到竞争cpu,你的电脑应该是单cpu的,所以是并发执行,所以执行哪一个线程是比较随机的。
xaobao 2007-11-19
  • 打赏
  • 举报
回复
帮顶了.
Wolf0403 2007-11-19
  • 打赏
  • 举报
回复
Java 1.5 及以后可以使用 java.util.concurrent 包的相关工具。
Wolf0403 2007-11-19
  • 打赏
  • 举报
回复
新线程和主线程是独立调度的,因此两者的运行次序关系是不可预知的,可能主循环执行完成了子线程也没有被调度过,也可能子线程先被调度,或者在主循环中任意一点被调度到,都是正确的。

因此,多线程要得到正确的(或者是可预知的)结果,应该使用同步。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(); // 等待新线程更新数据完毕
}
}
}
}
}
SINCE1978 2007-11-19
  • 打赏
  • 举报
回复
呵呵,我帮楼主测试完了,代码如下写即可打印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尚未结束、新线程也未真正开始。这是由于我们的代码用于测试,实际当中启动一个线程大多数是让它自己去做某件事,很少再次与它交互。
SINCE1978 2007-11-19
  • 打赏
  • 举报
回复
有意思,是不是因为你的真实线程对象是匿名的?

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()
.....

Kreocn 2007-11-19
  • 打赏
  • 举报
回复
应该是没有同步,我也碰到了这样的问题....可能是新线程和主线程同步比较麻烦....

所以我觉得最好是开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);
}
}

这样就看出来了...
ps1981sophia 2007-11-19
  • 打赏
  • 举报
回复
我的是一个yes,9个no,先打出原来的MyString,然后改变MyString,后面输出的就是no了.
piaopiao11 2007-11-19
  • 打赏
  • 举报
回复
把循环时间加长点

for(int i=0;i<10;i++)
try{
Thread.sleep(100);
}catch(Exception e){
}
System.out.print(t.MyString);
}
piaopiao11 2007-11-19
  • 打赏
  • 举报
回复
线程还没启动, 你的10个循环就做完了
zbl0201 2007-11-19
  • 打赏
  • 举报
回复
那为什么是十个yes啊
whfbbs 2007-11-19
  • 打赏
  • 举报
回复
第一个得分贴。。无啊无啊。谢谢lz ..哈哈!!
whfbbs 2007-11-19
  • 打赏
  • 举报
回复
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()

whfbbs 2007-11-19
  • 打赏
  • 举报
回复
实现implements Runnable

里面有个run

main里面start来启动这个run...
zbl0201 2007-11-19
  • 打赏
  • 举报
回复
我怎么越看越糊涂了
网络咖啡 2007-11-18
  • 打赏
  • 举报
回复
//启动线程
new Thread(t).start();

62,623

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧