发布网友 发布时间: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;
}