这道题想考察什么?
-
是否了解线程开启的方式?
-
开启大量线程会引起什么问题?为什么?怎么优化?
考察的知识点
-
线程的开启方式
-
开启大量线程的问题
-
线程池
考生应该如何回答
1、首先,关于如何开启一个线程,大多数人可能都会说3种,Thread、Runnable、Callback嘛!但事实却不是这样的。看JDK里怎么说的。
/**
* ...
* There are two ways to create a new thread of execution. One is to
* declare a class to be a subclass of <code>Thread</code>.
* The other way to create a thread is to declare a class that
* implements the <code>Runnable</code> interface.
* ....
*/
public class Thread implements Runnable{
}
Thread源码的类描述中有这样一段,翻译一下,只有两种方法去创建一个执行线程,一种是声明一个Thread的子类,另一种是创建一个类去实现Runnable接口。惊不惊讶,并没有提到Callback。
-
继承Thread类
public class ThreadUnitTest {
@Test
public void testThread() {
//创建MyThread实例
MyThread myThread = new MyThread();
//调用线程start的方法,进入可执行状态
myThread.start();
}
//继承Thread类,重写内部run方法
static class MyThread extends Thread {
@Override
public void run() {
System.out.println("test MyThread run");
}
}
}
-
实现Runnable接口
public class ThreadUnitTest {
@Test
public void testRunnable() {
//创建MyRunnable实例,这其实只是一个任务,并不是线程
MyRunnable myRunnable = new MyRunnable();
//交给线程去执行
new Thread(myRunnable).start();
}
//实现Runnable接口,并实现内部run方法
static class MyRunnable implements Runnable {
@Override
public void run() {
System.out.println("test MyRunnable run");
}
}
}
-
还是看看Callable是怎么回事吧
public class ThreadUnitTest {
@Test
public void testCallable() {
//创建MyCallable实例,需要与FutureTask结合使用
MyCallable myCallable = new MyCallable();
//创建FutureTask,与Runnable一样,也只能算是个任务
FutureTask<String> futureTask = new FutureTask<>(myCallable);
//交给线程去执行
new Thread(futureTask).start();
try {
//get方法获取任务返回值,该方法是阻塞的
String result = futureTask.get();
System.out.println(result);
} catch (ExecutionException e) {
e.printStackTrace();
} catch (InterruptedException e) {