我是java的初学者。我一直在研究多线程。我想创建两个线程,这两个线程必须同时运行单独的方法。这些线程应该调用sum和diff方法并同时运行。但我收到一个错误,该方法应该是线程类型。如何实现它。
class Demo implements Runnable
{
void sum()
{
//Some lines of code
}
void diff()
{
//Some lines of code
}
public void run ()
{
System.out.println("Inside run");
}
}
class Test
{
public static void main (String []args){
Demo o = new Demo ();
Demo o1 = new Demo ();
Thread th = new Thread (o);
Thread th1= new Thread(o1);
th.start();
th1.start();
o.th.sum(); // getting error here
o1.th1.diff(); // getting error here
}
}
答案 0 :(得分:1)
首先,您有一个编译错误,因为您尝试将变量th
作为Demo类型对象上的字段引用。 th
不是字段,而是一个局部变量,可以直接引用(即没有o.
前缀)。其次,sum()
和diff()
无法针对Thread的实例进行调用,因为这些方法不是由线程定义的,而是由您自己的Demo类定义的。
尽管如此,这些编译问题甚至不是此代码的根本问题。基于您的代码,您似乎对Java程序的语法和结构有一些基本的误解,因此在尝试解决并发编程之前,可能会对您进行一些入门级教程有所帮助。但是,为了完整起见,这里简要说明了为了使程序正常运行所需要做的事情。
当你调用Thread.start()时,它将分叉一个线程并调用你传递给该线程对象的构造函数的Runnable的run()方法。
为了调用两种不同的方法,您需要创建两个实现runnable的不同类,并将两个方法实现放在每个运行方法中。
示例:
public class Sum implements Runnable {
public void run() {
//Add up your numbers
}
}
public class Diff implements Runnable {
public void run() {
//Subtract numbers
}
}
public class Test {
public static void main(String[] args) {
Thread sumThread = new Thread(new Sum());
Thread diffThread = new Thread(new Diff());
sumThread.start();
diffThread.start();
}
}
答案 1 :(得分:1)
假设您收到编译错误,则语句o.th.sum()不正确。
语句o.th将使编译器在Demo类中查找名为th的公共静态类级别字段。由于Demo类中没有这样的字段,因此会出错。
答案 2 :(得分:0)
您收到此错误是因为您尝试使用Demo类的对象访问Thread的局部变量,如果您希望它在单独的线程中运行它,则无法直接调用该方法。只有在线程类上调用start()方法时才会生成新线程,然后它将在run()方法中执行代码。
根据您创建两个线程的要求,这两个线程必须同时运行单独的方法,以下代码应该可以工作。
class Demo implements Runnable
{
public void run ()
{
//sum() method code
}
}
class Demo1 implements Runnable
{
public void run ()
{
//diff() method code
}
}
class Test
{
public static void main (String []args){
Demo o = new Demo ();
Demo1 o1 = new Demo1 ();
Thread th = new Thread (o);
Thread th1= new Thread(o1);
th.start();
th1.start();
}
}