java创建线程的几种方式
1.通过实现Runnable接口创建线程
package com.javaBase.LineDistance; /** * 〈一句话功能简述〉; * 〈功能详细描述〉 * * @author jxx * @see [相关类/方法](可选) * @since [产品/模块版本] (可选) */ public class testRunn implements Runnable { @Override public void run() { System.out.println("123"); } }
package com.javaBase.LineDistance; /** * 〈一句话功能简述〉; * 〈多线程测试代码〉 * * @author jxx * @see [相关类/方法](可选) * @since [产品/模块版本] (可选) */ public class testLine { public static void main(String[] args){ Thread t = new Thread(new testRunn()); t.start(); } }
2.通过实现callable接口创建线程
package com.javaBase.LineDistance; import java.util.concurrent.Callable; /** * 〈一句话功能简述〉; * 〈功能详细描述〉 * * @author jxx * @see [相关类/方法](可选) * @since [产品/模块版本] (可选) */ public class TestCallable implements Callable { @Override public Object call() throws Exception { System.out.println("123"); return "1"; } }
package com.javaBase.LineDistance; import java.util.concurrent.Callable; import java.util.concurrent.FutureTask; /** * 〈一句话功能简述〉; * 〈多线程测试代码〉 * * @author jxx * @see [相关类/方法](可选) * @since [产品/模块版本] (可选) */ public class testLine { public static void main(String[] args){ Callable call = new TestCallable(); FutureTask future = new FutureTask(call); Thread t2 = new Thread(new testRunn()); t2.start(); } }
3.通过集成Thread类创建线程
package com.javaBase.LineDistance; /** * 〈一句话功能简述〉; * 〈功能详细描述〉 * * @author jxx * @see [相关类/方法](可选) * @since [产品/模块版本] (可选) */ public class TestThread extends Thread { @Override public void run() { System.out.println("123"); } public static void main(String[] args){ Thread t = new TestThread(); t.start(); } }
4.使用Executor框架来创建线程池
在Java 5之后,并发编程引入了一堆新的启动、调度和管理线程的API。Executor框架便是Java 5中引入的,其内部使用了线程池机制,它在java.util.cocurrent 包下,通过该框架来控制线程的启动、执行和关闭,可以简化并发编程的操作。因此,在Java 5之后,通过Executor来启动线程比使用Thread的start方法更好,除了更易管理,效率更好(用线程池实现,节约开销)外,还有关键的一点:有助于避免this逃逸问题——如果我们在构造器中启动一个线程,因为另一个任务可能会在构造器结束之前开始执行,此时可能会访问到初始化了一半的对象用Executor在构造器中。
package com.javaBase.LineDistance; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * 〈一句话功能简述〉; * 〈功能详细描述〉 * * @author jxx * @see [相关类/方法](可选) * @since [产品/模块版本] (可选) */ public class TestExcetor { public static void main(String[] args){ ExecutorService executorService = Executors.newCachedThreadPool(); executorService.execute(new testRunn()); executorService.shutdown(); } }
Executor框架后面再详解。
5.Runnable和Callable的区别
- Callable规定的方法是call(),Runnable规定的方法是run()
- Callable的任务执行后可返回值,而Runnable的任务是不能返回值得
- call方法可以抛出异常,run方法不可以
- 运行Callable任务可以拿到一个Future对象,表示异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的完成,并检索计算的结果。通过Future对象可以了解任务执行情况,可取消任务的执行,还可获取执行结果。