java如何重载run()方法

时间:2015-06-27 03:39:12

标签: java multithreading

我有一些像这样的代码,如何让两个run()方法在start()方法的不同线程中运行?

if (true){
  ...
}

function doSomething(){
  ...
}

2 个答案:

答案 0 :(得分:9)

您需要两个单独的线程,而您只需要实现Runnable。扩展线程意味着您希望更改Thread行为中的某些内容,而您不会这样做。

每个帖子都会做其他事情,因此有两个Runnable实施,Task1Task2

class Task1 implements Runnable (){
    public run(){
        System.out.println("Runnable 1");
    }
}

class Task2 implements Runnable (){
    public run(){
        System.out.println("Runnable 2");
    }
}

// create two threads, one for each task
Thread t1 = new Thread(new Task1());
Thread t2 = new Thread(new Task2());

// start the threads (should print the two messages)
t1.start();
t2.start();

要为不同的Runnable实现使用不同的参数,请使用如下构造函数:

class ParamTask implements Runnable (){
    String someArg;
    public ParamTask(String someArg){
        this.someArg = someArg;
    }    

    public run(){
        System.out.println("Runnable argument was: " + this.someArg);
    }
}

Thread argThread = new Thread(new ParamTask("this is a message"));

argThread.start();

答案 1 :(得分:0)

请记住,您可以在Thread中重载run()方法 子类。

public class FirstThread extends Thread{

    public static void main(String[] args) {
        FirstThread ft1= new FirstThread();
        ft1.start(); // Seperate call stack
        ft1.run("With parameter"); // same call stack
    }
    public void run(){
        System.out.println("Thread is running");
    }
    public void run(String s){
        System.out.println("Overloaded Thread is running " +s );
    }
}

Thread类会忽略重载的run(String s)方法,除非你自己调用它。 Thread类需要一个没有参数的run()方法,它会在一个单独的调用堆栈中为你执行这个方法 线程启动后。 使用run(String s)方法,Thread类不会为您调用该方法,即使您自己直接调用该方法,也不会在具有单独调用堆栈的新执行线程中执行。 它将发生在与您创建的代码相同的调用堆栈中 调用来自,就像任何其他常规方法调用一样。

资料来源:SCJP 1.6 Kathy Siera(第9章:主题,章节:定义一个主题)

现在为您的要求使用两个类实现Runnable Interface并在单独的调用堆栈上调用2个线程。使用任何一个线程调用run(String s)方法,它将在不同的调用堆栈上执行您的方法。

public class SeacondThreadRunnable {

public static void main(String[] a){

    Thread myThread1= new Thread(new MyRunnable());
    Thread myThread2= new Thread(new MyRunnable2());
    myThread1.start();
    myThread2.start();
 }
}
class MyRunnable implements Runnable{

@Override
public void run() {
    System.out.println("Runnable run method called " +Thread.currentThread().getName());

    run(" Overloaded Thread is running " );  // calling overloaded run method
}
public void run(String s){
    System.out.println( Thread.currentThread().getName() + s);
 } 
}
class MyRunnable2 implements Runnable{

@Override
public void run() {
    System.out.println("Runnable run method called " +Thread.currentThread().getName());
 }
}