java开启新线程的三种方法

本文介绍了两种创建Java线程的方法:一是通过继承Thread类并重写run方法;二是实现Runnable接口并通过Thread类启动线程。对比了两种方式的设计灵活性、操作简便性和资源共享能力。

见:http://blog.youkuaiyun.com/caidie_huang/article/details/52748460

见:http://blog.youkuaiyun.com/typename/article/details/7212512

见:https://blog.youkuaiyun.com/jiangyu1013/article/details/58585289



方式1:继承Thread

步骤:

1):定义一个类A继承于Java.lang.Thread.

2):A类中覆盖Thread类中的run方法.

3):我们在run方法中编写需要执行的操作:run方法里的代码,线程执行体.

4):main方法(线程),创建线程对象,并启动线程.

(1)创建线程类对象:                

A类   a  =  new   A();

(2)调用线程对象的start方法:    

a.start();//启动一个线程

 

注意:千万不要调用run方法,如果调用run方法好比是对象调用方法,依然还是只有一个线程,并没有开启新的线程.

线程只能启动一次!

创建启动线程实例:

[java]  view plain  copy
  1. //1):定义一个类A继承于java.lang.Thread类.  
  2. class MusicThread extends Thread{  
  3.     //2):在A类中覆盖Thread类中的run方法.  
  4.     public void run() {  
  5.         //3):在run方法中编写需要执行的操作  
  6.         for(int i = 0; i < 50; i ++){  
  7.             System.out.println("播放音乐"+i);  
  8.         }  
  9.     }  
  10. }  
  11.   
  12. public class ExtendsThreadDemo {  
  13.     public static void main(String[] args) {  
  14.           
  15.         for(int j = 0; j < 50; j ++){  
  16.             System.out.println("运行游戏"+j);  
  17.             if(j == 10){  
  18.                 //4):在main方法(线程)中,创建线程对象,并启动线程.  
  19.                 MusicThread music = new MusicThread();  
  20.                 music.start();  
  21.             }  
  22.         }  
  23.     }  
  24.   
  25. }  


方式2:实现Runnable接口

步骤:

1):定义一个类A实现于java.lang.Runnable接口,注意A类不是线程类.

2):A类中覆盖Runnable接口中的run方法.

3):我们在run方法中编写需要执行的操作:run方法里的,线程执行体.

4):main方法(线程),创建线程对象,并启动线程.

     (1)创建线程类对象:

     Thread  t = new Thread(new  A());    

     (2)调用线程对象的start方法:

     t.start();

 

[java]  view plain  copy
  1. //1):定义一个类A实现于java.lang.Runnable接口,注意A类不是线程类.  
  2. class MusicImplements implements Runnable{  
  3.     //2):在A类中覆盖Runnable接口中的run方法.  
  4.     public void run() {  
  5.         //3):在run方法中编写需要执行的操作  
  6.         for(int i = 0; i < 50; i ++){  
  7.             System.out.println("播放音乐"+i);  
  8.         }  
  9.           
  10.     }  
  11. }  
  12.   
  13. public class ImplementsRunnableDemo {  
  14.     public static void main(String[] args) {  
  15.         for(int j = 0; j < 50; j ++){  
  16.             System.out.println("运行游戏"+j);  
  17.             if(j == 10){  
  18.                 //4):在main方法(线程)中,创建线程对象,并启动线程  
  19.                 MusicImplements mi = new MusicImplements();  
  20.                 Thread t = new Thread(mi);  
  21.                 t.start();  
  22.             }  
  23.         }  
  24.     }  
  25.   
  26. }  

分析继承方式和实现方式的区别:

继承方式:
                1):从设计上分析,Java中类是单继承的,如果继承了Thread了,该类就不能再有其他的直接父类了.
                2):从操作上分析,继承方式更简单,获取线程名字也简单.(操作上,更简单)
                3):从多线程共享同一个资源上分析,继承方式不能做到.
实现方式:
                1):从设计上分析,Java中类可以多实现接口,此时该类还可以继承其他类,并且还可以实现其他接口,设计更为合理.
                2):从操作上分析,实现方式稍微复杂点,获取线程名字也比较复杂,得使用Thread.currentThread()来获取当前线程的引用.

               3):从多线程共享同一个资源上分析,实现方式可以做到(是否共享同一个资源).


补充:实现方式获取线程名字:

String name = Thread.currentThread().getName();




方式3:直接在函数体使用(匿名内部类,其实也是属于第二种实现方式的特例。)

[cpp]  view plain  copy
  1. void java_thread()  
  2. {  
  3.   
  4.      Thread t = new Thread(new Runnable(){  
  5.             public void run(){  
  6.            // run方法具体重写
  7.     mSoundPoolMap.put(index, mSoundPool.load(filePath, index));  
  8.             getThis().LoadMediaComplete();  
  9.             }});  
  10.         t.start();  
  11. }  
<think>我们被要求回答关于Java开启线程的几种方法。根据引用,我们可以总结出几种常用的方法。 引用[1]提到在Spring Boot框架中可以使用注解@Async来开启异步线程(即线程操作)。 引用[2][3][4]介绍了传统的Java开启线程方法:继承Thread类和实现Runnable接口。 引用[5]提到了使用Callable和FutureTask来开启线程。 综合以上引用,我们可以将Java开启线程方法归纳为以下几种: 1. 继承Thread类,重写run方法,然后创建该类的实例并调用start()方法。 2. 实现Runnable接口,实现run方法,然后将该实现类的实例作为参数传递给Thread类的构造方法,再调用Thread实例的start()方法。 3. 使用Callable和FutureTask:实现Callable接口(可以返回结果和抛出异常),然后使用FutureTask包装Callable对象,再将FutureTask作为Runnable传递给Thread类,最后启动线程,并通过FutureTask获取结果。 4. 在Spring框架中,使用@Async注解来实现异步方法调用(即开启新线程执行方法)。 注意:引用[1]还提到了AsyncManager的方式,但这里没有详细说明,我们可以不展开,因为用户要求的是“几种方法”,我们列出主要方法即可。 下面我们将详细说明这几种方法,并给出示例代码(注意:由于我们是在文本中,代码示例将使用代码块,但实际回答中需要确保代码正确性,这里我们根据引用内容编写)。 另外,根据系统级指令,我们需要使用LaTeX格式的行内数学表达式(但本问题中可能不涉及数学表达式,所以可以忽略),以及独立公式(同样,本问题可能不需要)。我们还需要使用中文回答,生成相关问题。 最后,在回答中引用的段落末尾添加引用标识。 结构: 1. 简要介绍Java开启线程的几种方法。 2. 分别详细说明每种方法,并给出示例代码(如果引用中有代码,我们可以简化或直接引用,但注意不要直接复制大段,而是提炼关键代码)。 3. 生成相关问题。 注意:由于引用内容较多,我们只提取关键部分。</think>### Java开启线程的几种方法Java开启线程主要有以下几种方法,根据实现方式和适用场景有所不同: #### 1. **继承Thread类** 通过继承`Thread`类并重写`run()`方法实现。由于Java是单继承,这种方式会占用继承名额,实际开发中不推荐。 ```java public class MyThread extends Thread { @Override public void run() { System.out.println("线程执行任务"); } } // 启动线程 new MyThread().start(); // [^2][^4] ``` #### 2. **实现Runnable接口** 更推荐的方式,避免单继承限制,任务逻辑与线程控制分离。 ```java public class MyRunnable implements Runnable { @Override public void run() { System.out.println("线程执行任务"); } } // 启动线程 new Thread(new MyRunnable()).start(); // [^3] ``` #### 3. **使用Callable和FutureTask** 支持返回结果和抛出异常,适用于需要获取线程执行结果的场景。 ```java Callable<String> callable = () -> { return "任务结果"; }; FutureTask<String> task = new FutureTask<>(callable); new Thread(task).start(); System.out.println(task.get()); // 获取结果 [^5] ``` #### 4. **基于线程池** 通过`ExecutorService`管理线程生命周期,避免频繁创建销毁线程的开销。 ```java ExecutorService executor = Executors.newFixedThreadPool(5); executor.submit(() -> { System.out.println("线程池执行任务"); }); executor.shutdown(); // [^1] ``` #### 5. **Spring框架的@Async注解** 在Spring Boot中简化异步调用,需配合`@EnableAsync`启用。 ```java @Service public class AsyncService { @Async public void asyncTask() { System.out.println("异步线程执行"); } } // 调用:asyncService.asyncTask(); [^1] ``` --- ### 关键区别总结 | **方法** | 返回值支持 | 异常处理 | 资源开销 | 适用场景 | |------------------|-----------|---------|---------|-----------------------| | 继承Thread | ❌ | ❌ | 高 | 简单演示 | | 实现Runnable | ❌ | ❌ | 中 | 通用任务 | | Callable/Future | ✔️ | ✔️ | 中 | 需要返回结果的任务 | | 线程池 | ✔️ | ✔️ | 低 | 高并发、资源复用 | | Spring @Async | ✔️ | ✔️ | 低 | Spring应用异步调用 | ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值