Java线程代码实现

线程的Java实现

参考博客:(http://www.importnew.com/20672.html)

1.继承Thread

声明Thread的子类; 这种方法是创建类继承Thread,然后重写Thread中的run方法

public class MyThread extends Thread {
   public void run(){
     System.out.println("MyThread running");
   }
}

稍微看一下Thread类的源码,原本的run方法:

/* What will be run. */
private Runnable target;

@Override
public void run() {
    if (target != null) {
        target.run();
    }
}

其中的target是run的任务,而新类直接继承Thread,重写run方法,相当于直接描述了run方法中要运行的任务。

运行Thread子类的方法

MyThread myThread = new MyThread();
myTread.start();

2.创建Thread的匿名子类

Thread thread = new Thread(){
   public void run(){
     System.out.println("Thread Running");
   }
};
thread.start();

3.实现Runnable接口

其实通过上面的Thread源码可以发现,实现Runnable target的构建,那么Thread的run方法也就有了实际意义;因此另一个多线程的写法是新类实现Runnable接口

public class RunnableThread implements Runnable {
	@Override
	public void run() {
		System.out.println(Thread.currentThread().getName());
	}

}

运行

public static void main(String[] args) {
    for (int i = 0; i < 5; i++) {
        new Thread(new RunnableThread()).start();
    }
}

4.创建实现Runnable接口的匿名类

new Thread(new Runnable(){
    @override
    public void run() {
        System.out.println("Thread is running");
    }
}).start();

5. 使用FutureTask

FutureTask实现了Runnable接口,因此FutureTask的对象也是可以当做runner的;而FutureTask对象的构造需要填入一个实现Callable接口的对象,因此:

public class CallableThread implements Callable<Integer> {
	@Override
	public Integer call() throws Exception {
		int i = 2017;
		Thread.sleep(3000);
        System.out.println(Thread.currentThread().getName() + " " + i);
        return i;
	}
}

运行测试一下:

for (int i = 0; i < 5; i++) {
    FutureTask<Integer> futureTask = new FutureTask<Integer>(new CallableThread());
    new Thread(futureTask, "有返回值的线程").start();
    try {
        System.out.println(futureTask.get());
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (ExecutionException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

但是这里有一个疑惑,就是输出是一个一个出来的,也就是看上去这五个线程是同步的,以后再研究一下,这块比较鬼

posted @ 2017-08-16 22:22  闫文雄  阅读(511)  评论(1编辑  收藏  举报