关于java中的创建线程这两种启动线程方法有什么不同?

发布网友 发布时间:2022-04-23 13:17

我来回答

1个回答

热心网友 时间:2023-09-15 23:47

//方法1:
//两个线程ee和ff共享同一个对象xc81,如果其中一个线程修改了xc81,另一个线程能访问到这种修改。
//方法2:
//与方法1相反。如果线程ee修改了对象xc81,不会影响xc82,修改是相互的。
//看例子。
public class XCTest
{
public static void main(String[] args)
{
//为了便于区分输出的内容,每次注释掉其中的一个再编译,对比运行的结果
XCTest.F1();
//XCTest.F2();
}
//因为xc81是共享的,当线程ee在run方法中修改xc81的msg后,线程ff的输出也改变了
static void F1()
{
Xc8 xc81=new Xc8();
xc81.msg="F1中的两个线程共享一个对象xc81";
Thread ee=new Thread(xc81);
ee.setName("F1中的线程ee");
Thread ff=new Thread(xc81);
ff.setName("F1中的线程ff");
ee.start();
ff.start();

}
//因为xc81归线程ee独享,当ee在run方法中修改xc81的msg后,线程ff的输出不变
static void F2()
{
Xc8 xc81=new Xc8();
xc81.msg="F2中的线程ee使用的对象xc81";
Xc8 xc82=new Xc8();
xc82.msg="F2中的线程ff使用的对象xc82";
Thread ee=new Thread(xc81);
ee.setName("F2中的线程ee");
Thread ff=new Thread(xc82);
ff.setName("F2中的线程ff");
ee.start();
ff.start();
}
}
class Xc8 implements Runnable
{
public void run()
{
for(int i=1;i<=10;i++)
{
System.out.println("由线程\""+Thread.currentThread().getName()+"\"输出的msg的内容:"+msg);
System.out.println();
if(6==i)
{
if(Thread.currentThread().getName().equals("F1中的线程ee"))
{
this.msg="由F1中的线程共享的对象xc81的msg,被F1中的线程ee改变了,导致F1中的另一个线程ff的输出也改变了";
}
else if(Thread.currentThread().getName().equals("F2中的线程ee"))
{
this.msg="F2中的线程ee,改变了它使用的对象xc81的msg的内容,没有影响F2中的另一个线程ff的输出";
}
}
try
{
Thread.sleep(2000);
}
catch(Exception e)
{

}
}
}
String msg;
}

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com