java中如何实现线程呢?
下文笔者讲述java中实现多线程的方法分享,如下所示
实现思路: 1.继承Tread类 2.实现Runnable接口 3.实现Callable接口:带有返回值例:
继承Thread类创建线程类(extends)
1.定义Thread类的子类,并重写该类的run方法 该run方法的方法体就代表了线程要完成的任务 因此把run()方法称为执行体(线程体)。 2.创建Thread子类的实例,即创建了线程对象。 3.调用线程对象的start()方法来启动该线程。
public class FirstThreadTest extends Thread{ int i = 0; //重写run方法,run方法的方法体就是现场执行体 public void run() { for(;i<88;i++){ log.info(getName()+" "+i); } } public static void main(String[] args) { for(int i = 0;i< 88;i++) { log.info(Thread.currentThread().getName()+" : "+i); if(i==20) { new FirstThreadTest().start(); new FirstThreadTest().start(); } } } }
通过Runnable接口创建线程类
1.定义runnable接口的实现类 并重写该接口的run()方法 该run()方法的方法体同样是该线程的线程执行体。 2.创建 Runnable实现类的实例 并以此实例作为Thread的target来创建Thread对象 该Thread对象才是真正的线程对象。 3.调用线程对象的start()方法来启动该线程。
public class RunnableThreadTest implements Runnable { private int i; public void run() { for(i = 0;i <88;i++) { log.info(Thread.currentThread().getName()+" "+i); } } public static void main(String[] args) { for(int i = 0;i < 88;i++) { log.info(Thread.currentThread().getName()+" "+i); if(i==20) { RunnableThreadTest runner= new RunnableThreadTest(); new Thread(runner,"新线程1").start(); new Thread(runner,"新线程2").start(); } } } }
通过Callable和Future创建线程
1.创建Callable接口的实现类 并实现call()方法 该call()方法将作为线程执行体 并且有返回值 public interface Callable { V call() throws Exception; } 2.创建Callable实现类的实例 使用FutureTask类来包装Callable对象 该FutureTask对象封装了 该Callable对象的call()方法的返回值 (FutureTask是一个包装器,它通过接受Callable来创建, 它同时实现了Future和Runnable接口) 3.使用FutureTask对象作为Thread对象的target创建并启动新线程 4.调用FutureTask对象的get()方法来获得子线程执行结束后的返回值
public class CallableThreadTest implements Callable<Integer> { public static void main(String[] args) { CallableThreadTest ctt = new CallableThreadTest(); FutureTask<Integer> ft = new FutureTask<>(ctt); for(int i = 0;i <88;i++) { log.info(Thread.currentThread().getName()+" 的循环变量i的值"+i); if(i==20) { new Thread(ft,"有返回值的线程").start(); } } try { log.info("子线程的返回值:"+ft.get()); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } } @Override public Integer call() throws Exception { int i = 0; for(;i<88;i++) { log.info(Thread.currentThread().getName()+" "+i); } return i; } }
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。