JAVA如何开启线程呢?
下文笔者讲述java代码开启线程的方法及示例分享,如下所示
开启线程的方法
开始线程的方式 方式1:继承Thread类 方式2:实现Runnable接口 方式3:实现Callable接口 方式4:采用线程池的方式例:
1.继承Thread类
继承Thread类,重写run方法
public class ExtendThread extends Thread { /* * 创建步骤如下: * 1.定义Thread类的子类,并重写该类的run()方法 该run()方法的方法体就代表了线程需要完成的任务。因此把run方法称为线程执行体。 * 2.创建Thread子类了的实例,即创建线程对象。本实例中是new一个ExtendThread 即可创建线程对象,也就是开启了一个线程 * 3.调用线程对象的start()方法来启动该线程。 * * 调用示例: * //循环10次即开启10个线程 * for (int i = 0; i < 10; i++) { * ExtendThread extendThread = new ExtendThread(); * extendThread.start(); * } * */ /** * 重写Thread类的run(),这个方法称为线程执行体 * */ @Override public void run() { doSomething(); } /** * 需要处理的任务 * */ public void doSomething(){ for (int i = 0; i < 10; i++) { System.out.println(Thread.currentThread().getName() + "执行" + i); } } }
2.实现Runnable接口
方式一:直接实现Runnable接口
public class RunnableImpl implements Runnable { /* * 创建步骤如下: * 1.定义Runnable接口的实现类,并且实现run方法,这个方法同样是线程执行体 * 2.创建Runnable实现类的实例,并以此实例对象作为Thread的target来创建Thread类 这个新创建的Thread对象才是真正的线程对象,即开启了新的线程 * 3.调用线程对象的start()方法来开启该线程 * * 调用示例: * //开启10个线程 * for (int i = 0; i < 10; i++) { * Thread thread = new Thread(new RunnableImpl()); * thread.start(); * } * */ /** * 实现Runnable接口的run方法,这个方法称为线程执行体 * */ @Override public void run() { doSomething(); } /** * 需要处理的任务 * */ private void doSomething(){ for (int i = 0; i < 10; i++) { System.out.println(Thread.currentThread().getName() + "执行" + i); } } }
方式二:匿名内部类
public class Anonymous { /* * 创建步骤如下: * 匿名内部类本质上也是一个类实现了Runnable接口,重写了run方法 此类没有名字,直接作为参数传入Thread类 * * 调用示例: * //开启10个线程 * for (int i = 0; i < 10; i++) { * Anonymous anonymous =new Anonymous(); * anonymous.myRun(); * } * * */ public void myRun(){ new Thread(new Runnable() { @Override public void run() { doSomething(); } }).start(); } /** * 需要处理的任务 * */ private void doSomething(){ for (int i = 0; i < 10; i++) { System.out.println(Thread.currentThread().getName() + "执行" + i); } } }
3.实现Callable接口
public class CallableImpl implements Callable<String> { /* * 创建步骤如下: * 1,定义实现Callable<V>接口的实现类,实现call方法,这个方法是线程执行体 * 2,创建Callable<V>实现类的实例,借助FutureTask得到线程执行的返回值 * 3,将FutureTask的实例,作为Thread的target来创建Thread类 * 4,调用start方法,开启线程 * * 调用示例: * Callable<String> tc = new CallableImpl(); * FutureTask<String> task = new FutureTask<>(tc); * new Thread(task).start(); * try { * System.out.println(task.get()); * } catch (InterruptedException | ExecutionException e) { * e.printStackTrace(); * } * * 说明: * 1.与使用Runnable相比, Callable功能更强大些 * 2.实现的call()方法相比run()方法,可以返回值 * 3.方法可以抛出异常 * 4.支持泛型的返回值 * 5.需要借助FutureTask类,比如获取返回结果 * Future接口可以对具体Runnable、Callable任务的执行结果进行取消、查询是否完成、获取结果等 * FutureTask是Futrue接口的唯一的实现类 * FutureTask 同时实现了Runnable, Future接口。它既可以作为Runnable被线程执行 可作为Future得到Callable的返回值 * * */ private int ticket = 5; @Override public String call() throws Exception { for (int i = 0; i < 10; i++) { System.out.println(doSomething()); } return "出票任务完成"; } public String doSomething() { String result = ""; if (this.ticket > 0) { result = "出票成功,ticket=" + this.ticket--; } else { result = "出票失败,ticket=" + this.ticket; } return result; } }
4.创建线程池
public class ThreadPool implements Runnable { /* * 创建步骤如下: * 1.定义Runnable接口的实现类,或者定义(继承Runnable接口的类)的实现类 并且实现run方法,这个方法是线程执行体 * 2.创建一个自定义线程个数的线程池 * 3.实例化Runnable接口的实现类 * 4.将3步的实例,作为线程池实例的execute方法的command参数,开启线程 * 5.关闭线程池 * * 调用示例: * ExecutorService pool = Executors.newFixedThreadPool(2); * ThreadPool threadPool = new ThreadPool("AA"); * ThreadPool threadPoo2 = new ThreadPool("BB"); * pool.execute(threadPool); * pool.execute(threadPoo2); * pool.shutdown(); * * 说明: * 示例中创建的是2个线程的线程池 * execute方法是开启线程方法,实参要求是实现Runnable的类 * 所以,继承Thread类的子类也可以以线程池的方式开启线程 * * */ String name; public ThreadPool(String name) { this.name = name; } @Override public void run() { doSomething(); } /** * 需要处理的任务 * */ private void doSomething() { for (int i = 0; i < 10; i++) { System.out.println(Thread.currentThread().getName() + "执行" + i + ",name=" + this.name); } } }
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。