java中创建线程的四种方式
方式一:通过继承Thread父类
package com.yunhe.thread;
public class ThreadDemo01 extends Thread{
@Override
public void run() {
for (int i = 0; i < 1000; i++) {
System.out.println(getName()+":"+i);
}
}
}
// 另一个类中创建一个线程进行调用
class test{
public static void main(String[] args) {
ThreadDemo01 threadDemo01 = new ThreadDemo01();
threadDemo01.setName("Thread线程");
threadDemo01.start();
}
}
方式二:实现Runnable接口
class A implements Runnable{
@Override
public void run() {
for (int i = 0; i < 1000; i++) {
System.out.println(Thread.currentThread().getName()+":"+i);
}
}
}
public class Demo03 {
/**
* 多线程创建的第二种方式,使用 Runnable接口
* 该接口还需要传递给Thread类才能启动,否则自己启动不了
*
* 两种方式:推荐使用第二种
* 1、Thread类是一个线程类,它只需要管理好线程就行了,不需要管业务怎么写
* 2、具体的业务可以交给Runnable接口实现
* 3、java是单继承的,继承了Thread,就无法继承别的类了,但是可以实现多个接口。
*/
public static void main(String[] args) {
A a = new A();
new Thread(a).start();
// Runnable接口本身就是一个函数式接口,就可以使用lambda表达式,代码可以简化为如下:
new Thread( ()-> {
for (int i = 0; i < 1000; i++) {
System.out.println(Thread.currentThread().getName()+":"+i);
}
}).start();
for (int i = 0; i < 1000; i++) {
System.err.println(Thread.currentThread().getName()+":"+i);
}
}
}
方式三:通过实现callable接口
class Demo implements Callable<Integer>{
@Override
public Integer call() throws Exception {
System.out.println(Thread.currentThread().getName());
return 1;
}
}
// 该接口怎么使用呢?
// 不能直接替代Runnable接口,使用方法如下:
public static void main(String[] args) throws ExecutionException, InterruptedException {
FutureTask<Integer> task = new FutureTask<>(new Demo());
// 调用线程 AA 设置线程名
new Thread(task,"AA").start();
// 获取返回值
System.out.println(task.get());
}
方式四:调用线程池
//创建线程池
ExecutorService pool= Executors.newFixedThreadPool(5);
//可以是Thread子类 Runnable实现类
threadPool.submit(runnable);
threadPool.submit(thread);
// 或者
threadPool.execute(thread)
//关闭线程池
threadPool.shutdown();
原文地址:https://blog.csdn.net/weixin_52642840/article/details/143867990
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!