java之线程的创建方式
继承Thread类,实现run方法
class Thread1 extends Thread{
@Override
public void run() {
System.out.println(Thread.currentThread()+"创建线程的第一种方法");
}
}
Thread1 thread1 = new Thread1();
thread1.start();
实现Runnable接口,重写run方法
class Thread2 implements Runnable {
@Override
public void run() {
System.out.println(Thread.currentThread()+"创建线程的第二种方法");
}
}
// 创建线程的第二种方法
Thread2 thread2 = new Thread2();
Thread thread = new Thread(thread2);
thread.start();
① Thread类本质上是实现了Runnable接口,Thread对象代表一个线程的实例。
② Runnable接口只有一个抽象的run()方法。
③ 启动线程的唯一方法就是通过Thread类的start()实例方法。
④ start()方法是一个native方法,它将启动一个新线程,并执行run()方法。
⑤ 自定义类直接extend Thread,并复写run()方法,就可以启动新线程并执行自己定义的run()方法。
实现Callable接口(有返回值)
class Thread3 implements Callable<String> {
@Override
public String call() throws Exception {
return Thread.currentThread()+"创建线程的第三种方法";
}
}
// 创建线程的第三种方法
Callable<String> callable = new Thread3();
FutureTask<String> futureTask = new FutureTask<>(callable);
Thread thread3 = new Thread(futureTask);
thread3.start();
// 获得返回值
String s = futureTask.get();
System.out.println(s);
通过线程池创建线程
// 创建线程的第四种方法
Executor executor = Executors.newFixedThreadPool(5);
executor.execute(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread()+"创建线程的第四种方法");
}
});
((ExecutorService) executor).shutdown();
// 创建线程的五种方式:ThreadPoolExecutor
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(Runtime.getRuntime().availableProcessors(),
Runtime.getRuntime().availableProcessors()*2+1,
3,
TimeUnit.SECONDS,
new LinkedBlockingQueue<>(3),
Executors.defaultThreadFactory(),
new ThreadPoolExecutor.AbortPolicy() // 队列满了还有人进来,不处理这个人,抛出异常
);
for (int i = 0; i < 40 ; i++) {
int finalI = i;
threadPoolExecutor.execute(() -> {
try {
Thread.sleep(1000*3);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "开始执行" + finalI);
});
}
// 线程池用完,程序结束关闭线程池
try {
threadPoolExecutor.shutdown();
} catch (Exception e) {
e.printStackTrace();
}