线程的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();
}
}
但是这里有一个疑惑,就是输出是一个一个出来的,也就是看上去这五个线程是同步的,以后再研究一下,这块比较鬼