创建方式一:继承Thread类
①定义子类继承Thread类。
②子类中重写Thread类中的run方法。
③创建Thread子类的对象,即创建了线程对象。
④调用线程对象start方法:启动线程,调用run方法。
class MyThread01 extends Thread {
@Override
public void run() {
System.out.println("-----MyThread01");
}
}
new MyThread01().start();
创建方式二:实现Runnable接口
①定义子类,实现Runnable接口
②子类中重写Runnable接口中的run方法
③通过Thread类含参构造器创建线程对象
④将Runnable接口的子类对象作为实际参数传递给Thread类的构造器
⑤调用Thread类中的start方法,开启线程,调用Runnable子类接口的run方法
class MyThread02 implements Runnable {
public void run() {
System.out.println("-----MyThread02");
}
}
new Thread(new MyThread02()).start();
创建方式三:实现Callable接口
方法可以抛出异常
支持泛型的返回值
需要借助FutureTask类,比如获取返回结果
class MyThread03 implements Callable<Integer> {
@Override
public Integer call() throws Exception {
System.out.println("-----MyThread03");
return 200;
}
}
FutureTask<Integer> futureTask = new FutureTask<Integer>(new MyThread03());
new Thread(futureTask).start();
try {
Integer value = futureTask.get();//得到返回值
System.out.println(value);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
创建方式四:使用线程池
提前创建好多个线程,放入线程池中,使用时直接获取,使用完放回池中。
class MyThread implements Runnable {
@Override
public void run() {
for (int i = 1; i <= 100; i++) {
System.out.println(Thread.currentThread().getName() + ":" + i);
}
}
}
public class ThreadPool {
public static void main(String[] args) {
// 1.调用Executors的newFixedThreadPool(),返回指定线程数量的ExecutorService
ExecutorService pool = Executors.newFixedThreadPool(10);
// 2.将Runnable实现类的对象作为形参传递给ExecutorService的submit()方法中,开启线程
// 并执行相关的run()
pool.execute(new MyThread());
pool.execute(new MyThread());
pool.execute(new MyThread());
// 3.结束线程的使用
pool.shutdown();
}
}