1.创建线程有哪几种方式?
创建线程有三种方式,分别是继承Thread类、实现Runnable接口、实现Callable接口。
-
通过继承Thread类来创建并启动线程的步骤如下:
- 定义Thread类的子类,并重写该类的run()方法,该run()方法将作为线程执行体。
- 创建Thread子类的实例,即创建了线程对象。
- 调用线程对象的start()方法来启动该线程。
//步骤1:定义Thread的子类,重写该类的run方法 class TreadSon extends Thread{ private static int ticket = 100; public TreadSon(String name) { setName(name); } @Override public void run() { while(true){ //便于观察线程执行过程,线程休眠 try { Thread.sleep(100); } catch (InterruptedException e) { throw new RuntimeException(e); } synchronized (this){ if (ticket<=0){ break; } System.out.println(Thread.currentThread().getName()+"已售出第"+ticket+"张票"); ticket--; } } } } //2. 创建Tread对象的实例 class ThreadTest{ public static void main(String[] args){ TreadSon thread1 = new TreadSon("窗口1"); TreadSon thread2 = new TreadSon("窗口2"); //3. 调用start方法启动线程 thread1.start(); thread2.start(); } }
-
通过实现Runnable接口来创建并启动线程的步骤如下:
- 定义Runnable接口的实现类,并实现该接口的run()方法,该run()方法将作为线程执行体。
- 创建Runnable实现类的实例,并将其作为Thread的target来创建Thread对象,Thread对象为线程对象。
- 调用线程对象的start()方法来启动该线程。
//1. 定义Runnable接口的实现类,并实现该接口的run()方法
class RunnableImpl implements Runnable{
private static int ticket = 100;
@Override
public void run() {
while(true){
try {
Thread.sleep(200);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
synchronized (this){
if (ticket <= 0) {
break;
}
System.out.println(Thread.currentThread().getName()+"售出了第"+ticket+"张票");
ticket--;
}
}
}
}
// 2. 创建Runnable实现类的实例,并将其作为Thread的target来创建Thread对象,Thread对象为线程对象。
public class RunnableTest {
public static void main(String[] args) {
RunnableImpl runnable = new RunnableImpl();
//3. 调用线程对象的start()方法来启动该线程。
new Thread(runnable,"窗口1").start();
new Thread(runnable,"窗口2").start();
}
}
通过实现Callable接口来创建并启动线程的步骤如下:
-
创建Callable接口的实现类,并实现call()方法,该call()方法将作为线程执行体,且该call()方法有返回值。然后再创建Callable实现类的实例。
-
使用FutureTask类来包装Callable对象,该FutureTask对象封装了该Callable对象的call()方法的返回值。
-
使用FutureTask对象作为Thread对象的target创建并启动新线程。
-
调用FutureTask对象的get()方法来获得子线程执行结束后的返回值。
//创建Callable接口的实现类,实现call方法
class CallableImpl implements Callable{
private static int ticket = 100;
@Override
public String call() throws Exception {
while (true){
Thread.sleep(100);
synchronized (this){
if (ticket <= 0) {
break;
}
System.out.println(Thread.