创建线程的四种方式
一、继承Thread类
继承Thread类创建线程的步骤为:
(1)创建一个类继承Thread类,重写run()方法,将所要完成的任务代码写进run()方法中;
(2)创建Thread类的子类的对象;
(3)调用该对象的start()方法,该start()方法表示先开启线程,然后调用run()方法;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | public class Thread1 { public static void main(String[] args) { Thread.currentThread().setName( "主线程" ); System.out.println(Thread.currentThread().getName()+ ":" + "输出的结果" ); //创建一个新线程 ThreadDemo1 thread1 = new ThreadDemo1(); //为线程设置名称 thread1.setName( "线程一" ); //开启线程 thread1.start(); } } class ThreadDemo1 extends Thread{ @Override public void run() { System.out.println(Thread.currentThread().getName()+ ":" + "输出的结果" ); } } |
二、实现Runnable接口
实现Runnable接口创建线程的步骤为:
(1)创建一个类并实现Runnable接口
(2)重写run()方法,将所要完成的任务代码写进run()方法中
(3)创建实现Runnable接口的类的对象,将该对象当做Thread类的构造方法中的参数传进去
(4)使用Thread类的构造方法创建一个对象,并调用start()方法即可运行该线程
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | public class Thread2 { public static void main(String[] args) { Thread.currentThread().setName( "主线程" ); System.out.println(Thread.currentThread().getName()+ ":" + "输出的结果" ); //创建一个新线程 Thread thread2 = new Thread( new ThreadDemo2()); //为线程设置名称 thread2.setName( "线程二" ); //开启线程 thread2.start(); } } class ThreadDemo2 implements Runnable { @Override public void run() { System.out.println(Thread.currentThread().getName()+ ":" + "输出的结果" ); } } |
三、实现Callable接口
实现Callable接口创建线程的步骤为:
(1)创建一个类并实现Callable接口
(2)重写call()方法,将所要完成的任务的代码写进call()方法中,需要注意的是call()方法有返回值,并且可以抛出异常
(3)如果想要获取运行该线程后的返回值,需要创建Future接口的实现类的对象,即FutureTask类的对象,调用该对象的get()方法可获取call()方法的返回值
(4)使用Thread类的有参构造器创建对象,将FutureTask类的对象当做参数传进去,然后调用start()方法开启并运行该线程。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | public class Thread3 { public static void main(String[] args) throws Exception { Thread.currentThread().setName( "主线程" ); System.out.println(Thread.currentThread().getName()+ ":" + "输出的结果" ); //创建FutureTask的对象 FutureTask<String> task = new FutureTask<String>( new ThreadDemo3()); //创建Thread类的对象 Thread thread3 = new Thread(task); thread3.setName( "线程三" ); //开启线程 thread3.start(); //获取call()方法的返回值,即线程运行结束后的返回值 String result = task.get(); System.out.println(result); } } class ThreadDemo3 implements Callable<String> { @Override public String call() throws Exception { System.out.println(Thread.currentThread().getName()+ ":" + "输出的结果" ); return Thread.currentThread().getName()+ ":" + "返回的结果" ; } } |
四、使用线程池创建
使用线程池创建线程的步骤:
(1)使用Executors类中的newFixedThreadPool(int num)方法创建一个线程数量为num的线程池
(2)调用线程池中的execute()方法执行由实现Runnable接口创建的线程;调用submit()方法执行由实现Callable接口创建的线程
(3)调用线程池中的shutdown()方法关闭线程池
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 | public class Thread4 { public static void main(String[] args) throws Exception { Thread.currentThread().setName( "主线程" ); System.out.println(Thread.currentThread().getName()+ ":" + "输出的结果" ); //通过线程池工厂创建线程数量为2的线程池 ExecutorService service = Executors.newFixedThreadPool( 2 ); //执行线程,execute()适用于实现Runnable接口创建的线程 service.execute( new ThreadDemo4()); service.execute( new ThreadDemo6()); service.execute( new ThreadDemo7()); //submit()适用于实现Callable接口创建的线程 Future<String> task = service.submit( new ThreadDemo5()); //获取call()方法的返回值 String result = task.get(); System.out.println(result); //关闭线程池 service.shutdown(); } } //实现Runnable接口 class ThreadDemo4 implements Runnable{ @Override public void run() { try { Thread.sleep( 1000 ); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+ ":" + "输出的结果" ); } } //实现Callable接口 class ThreadDemo5 implements Callable<String>{ @Override public String call() throws Exception { try { Thread.sleep( 1000 ); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+ ":" + "输出的结果" ); return Thread.currentThread().getName()+ ":" + "返回的结果" ; } } //实现Runnable接口 class ThreadDemo6 implements Runnable{ @Override public void run() { try { Thread.sleep( 1000 ); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+ ":" + "输出的结果" ); } } //实现Runnable接口 class ThreadDemo7 implements Runnable{ @Override public void run() { try { Thread.sleep( 1000 ); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+ ":" + "输出的结果" ); } } |
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(四):结合BotSharp
· 一个基于 .NET 开源免费的异地组网和内网穿透工具
· 《HelloGitHub》第 108 期
· Windows桌面应用自动更新解决方案SharpUpdater5发布
· 我的家庭实验室服务器集群硬件清单