在Java中使用多个线程

时间:2014-06-07 19:47:23

标签: java multithreading

我一直在努力了解多线程是如何工作的,所以我运行了下面的代码:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package mainBowl;

import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Kbluue
 */
public class ThreadStudy {

Thread t, t1, t2;
Runnable r, r1, r2;

public ThreadStudy() {
    init();
}


public void start(){

}

private void init(){
    t = new Thread(r);
    t.setName("Thread");
    t1 = new Thread(r1);
    t1.setName("Thread 1");
    t2 = new Thread(r2);
    t2.setName("Thread 2");

    r = new Runnable() {

        @Override
        public void run() {
           // throw new UnsupportedOperationException("Not supported yet.");
            if (t != null){
                printStart(t);
                try {
                    Thread.currentThread().wait();
                } catch (Exception e){
                    printError(t);
                }
                printResume(t);
                t1.notify();
            }
        }
    };
    r1 = new Runnable() {

        @Override
        public void run() {
           // throw new UnsupportedOperationException("Not supported yet.");
            if (t != null){
                printStart(t1);
                try {
                    t1.wait();
                } catch (InterruptedException ex) {
                    Logger.getLogger(ThreadStudy.class.getName()).log(Level.SEVERE, null, ex);
                }
                printResume(t1);
                t2.notify();
            }
        }
    };
    r2 = new Runnable() {

        @Override
        public void run() {
           // throw new UnsupportedOperationException("Not supported yet.");
            if (t != null){
                printStart(t2);
                t.notify();
                printResume(t2);
            }
        }
    };
}

private void printStart(Thread t){
    System.out.println("This is a new thread starting" + t.getName());
}

private void printResume(Thread t){
    System.out.println("This is a thread resuming" + t.getName());
}
private void printError(Thread t){
    System.out.println("There is an error" + t.getName());
}

public void run(){
    t.start();
    t1.start();
    t2.start();
}

}

然后我在主要活动

中运行了这个
new ThreadStudy().run;

但输出没有任何结果。刚刚;

run:
BUILD SUCCESSFUL (total time: 0 seconds)

甚至不能使用错误消息。

此外,我想知道是否有更多方法可以将命令/方法添加到除新线程(Runnable r)方法之外的线程中。 感谢您的期待。

2 个答案:

答案 0 :(得分:3)

在初始化之前,您将Runnable变量传递给Thread构造函数。当线程启动时,它将委托给它自己的run方法,该方法什么都不做。

请记住,java是按值传递的。

答案 1 :(得分:1)

  

值得一读Oracle Java Tutorial - Defining and Starting a Thread

创建Thread实例的应用程序必须提供将在该线程中运行的代码。有两种方法可以做到这一点:

  • 提供Runnable对象。 Runnable接口定义了一个run方法,用于包含线程中执行的代码。 Runnable对象被传递给Thread构造函数。

  • 子类线程。 Thread类本身实现了Runnable,尽管它的run方法什么都不做。应用程序可以子类化Thread,提供自己的run实现。


您只需覆盖Runnable

的默认run()方法,即可在不使用Thread界面的情况下执行此操作

示例代码:

t = new Thread(){
    @Override
    public void run() {
       // add your logic here
       // or call any method from here
    }
};