前言
面试造火箭,入职拧螺丝。用不用的到,面试基本都会问多线程相关知识。
此文,用以介绍线程的创建方式,仅仅是小小的demo,具体使用需要根据业务需求斟酌具体怎么玩,不过正常工作都是用线程池的,后面单独写一篇关于线程池的理解。
1.run和start
我相信有不少初学者和我刚学的时候一样,很懵逼,为啥不调用run方法,而要调用start呢?
答:run方法只是Thread的一个普通方法,你直接调用的话,仅仅是调用一个方法,不会开辟一个线程;start方法底层是调用了native的start0,也就是说调用了本地方法去开辟一个线程,其实是native方法回调run方法的。
public synchronized void start() {
...
start0();
started = true;
...
}
private native void start0();
2.创建方式
方式一:继承Thread类,重写run方法
public class TestThread {
public static void main(String[] args) {
//创建线程对象
Thread myThread = new MyThread();
myThread.start();
}
}
//继承Thread
class MyThread extends Thread{
@Override
public void run() {
super.run();
System.out.println("This is myThread");
}
}
方式二:实现Runnable类,重写run方法
public class TestThread {
public static void main(String[] args) {
//创建Runnable子类
MyThread mt = new MyThread();
//创建线程
Thread myThread = new Thread(mt);
myThread.start();
}
}
//实现Runnable接口
class MyThread implements Runnable{
@Override
public void run() {
System.out.println("This is myRunnable");
}
}
方式三:实现Callable 类,重写call方法
public class TestThread {
public static void main(String[] args) {
//创建callable对象
MyThread mt = new MyThread();
//创建“未来”对象
FutureTask task = new FutureTask(mt);
//创建线程
Thread myThread = new Thread(task);
myThread.start();
}
}
//实现Callable
class MyThread implements Callable {
@Override
public Object call() throws Exception {
System.out.println("This is myCallable");
return null;
}
}
FutureTask 是一个可取消的异步计算,感兴趣的同志可以自己去百度看看,这里不做过多介绍了。JDK8还有其他有意思的Future供你玩。
实现Callable和Runnable的区别你发现了吗?可以根据业务需求斟酌具体怎么玩。
总结
线程的创建方式看demo比较简单,在工作中一般不是这样创建的,但是要这些基础知识也必须要掌握。