对于你喜欢的事想去作的事,你必须付出百分之一千的努力,你知道这一路可能会有不少困难,会有坚持不下去想要放弃的时候,也有时候,你不必定会获得你想要的结果,但你必定要相信,就算再贫瘠的土地你日日灌溉,总有那么一天会长出花草来的,因此你必定要坚持。java
示例代码为:编程
package com.thread; public class FirstThreadTest extends Thread { int i = 0; //重写run方法,run方法的方法体就是现场执行体 public void run() { for (; i < 100; i++) { System.out.println(getName() + " " + i); } } public static void main(String[] args) { for (int i = 0; i < 100; i++) { System.out.println(Thread.currentThread().getName() + " : " + i); if (i == 20) { new FirstThreadTest().start(); new FirstThreadTest().start(); } } } }
上述代码中Thread.currentThread()方法返回当前正在执行的线程对象。GetName()方法返回调用该方法的线程的名字。多线程
示例代码为:异步
package com.thread; public class RunnableThreadTest implements Runnable { private int i; public void run() { for (i = 0; i < 100; i++) { System.out.println(Thread.currentThread().getName() + " " + i); } } public static void main(String[] args) { for (int i = 0; i < 100; i++) { System.out.println(Thread.currentThread().getName() + " " + i); if (i == 20) { RunnableThreadTest rtt = new RunnableThreadTest(); new Thread(rtt, "新线程1").start(); new Thread(rtt, "新线程2").start(); } } } }
线程的执行流程很简单,当执行代码start()时,就会执行对象中重写的void run();方法,该方法执行完成后,线程就消亡了。ide
(1)建立Callable接口的实现类,并实现call()方法,该call()方法将做为线程执行体,而且有返回值。this
public interface Callable { V call() throws Exception; }
(2)建立Callable实现类的实例,使用FutureTask类来包装Callable对象,该FutureTask对象封装了该Callable对象的call()方法的返回值。(FutureTask是一个包装器,它经过接受Callable来建立,它同时实现了Future和Runnable接口。)线程
(3)使用FutureTask对象做为Thread对象的target建立并启动新线程。code
(4)调用FutureTask对象的get()方法来得到子线程执行结束后的返回值对象
实例代码:继承
package com.thread; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.FutureTask; 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 < 100; i++) { System.out.println(Thread.currentThread().getName() + " 的循环变量i的值" + i); if (i == 20) { new Thread(ft, "有返回值的线程").start(); } } try { System.out.println("子线程的返回值:" + ft.get()); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } } @Override public Integer call() throws Exception { int i = 0; for (; i < 100; i++) { System.out.println(Thread.currentThread().getName() + " " + i); } return i; } }
优点是:
线程类只是实现了Runnable接口或Callable接口,还能够继承其余类。
在这种方式下,多个线程能够共享同一个target对象,因此很是适合多个相同线程来处理同一份资源的状况,从而能够将CPU、代码和数据分开,造成清晰的模型,较好地体现了面向对象的思想。
劣势是:
编程稍微复杂,若是要访问当前线程,则必须使用Thread.currentThread()方法。
优点是:
编写简单,若是须要访问当前线程,则无需使用Thread.currentThread()方法,直接使用this便可得到当前线程。
劣势是:
线程类已经继承了Thread类,因此不能再继承其余父类。
(1) Callable规定(重写)的方法是call(),Runnable规定(重写)的方法是run()。
(2) Callable的任务执行后可返回值,而Runnable的任务是不能返回值的。
(3) call方法能够抛出异常,run方法不能够。
(4) 运行Callable任务能够拿到一个Future对象,表示异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的完成,并检索计算的结果。经过Future对象能够了解任务执行状况,可取消任务的执行,还可获取执行结果。