我试着写了一段教科书上关于同步线程的代码。但是得到了错误。
cannot find symbol f.start(); and t.display();
教科书上的代码应该在没有synchronized关键字的情况下进行尝试,但似乎编译器无法识别该对象,请帮助我。
class First
{
synchronized void display (String s)
{
System.out.println(s);
try
{
Thread.sleep(1000);
}
catch(InterruptedException e)
{
System.out.println("Interrupted");
}
System.out.println("***");
}
}
class Second implements Runnable
{
String s;
First f;
Thread t;
public Second(First f1,String s1)
{
f=f1;
s=s1;
t=new Thread(this);
f.start();
}
public void run()
{
t.display(s);
}
}
class SyncThread
{
public static void main(String args[])
{
First f=new First();
Second ob1=new Second(f,"First");
Second ob2=new Second(f,"Second");
Second ob3=new Second(f,"Third");
try
{
ob1.t.join();
ob2.t.join();
ob3.t.join();
}
catch(InterruptedException e)
{
System.out.println("Interrupted");
}
}
}
线程类没有显示方法,而你的类First有显示方法。我认为你打错了t.display()和f.start()。试着换成f.display()和t.start()。
而不是做
t = new Thread(this);
f.start();
试。
t = new Thread(this);
t.start();
而在 run
试试 f.display()
而不是 t.display()
看起来你把一些变量搞乱了。试试用一些有意义的名字来代替 f
和 t
. 比较难搞 thread.start()
和 first.display()
比 t.start()
和 f.display()
.
它给你一个错误,可能是因为你没有使用'run()'函数上面的@Override注解,这里是修改后的代码。
@Override
public void run()
{
f.display(s);
}
请不要在构造函数中运行线程,因为这是不安全的,你也犯了一个错误,因为应该是t.start()而不是f.start(),类似的变化在run()中应该是f.display(s)而不是t.display(s)。
变化。
@Override
public void run()
{
f.display(s);
}
还有:
t=new Thread(this);
t.start();
记住你的变量,因为它会造成这样的问题!现在程序应该可以正常运行,不会出现任何错误了。