我们先来看段示例代码
import java.util.concurrent.callable; import java.util.concurrent.futuretask; public class main {public static void main (string [] args) {// 方法一 : 继承 스레드 int i = 0; // for (; i <100; i ++) {// system.out.println (gretname.println). i); // if (i == 5) {// rewlextendsThreadthreadthextendsThread = new The ResplexTendsThread (); // rewlextendsThread.start (); //} //} // 方法二 : runnable // for (i = 0; i <100; i ++) {// system.out.println (thread.current ()). " + i); // if (i == 5) {// runnable runnable = new ThreadimplementsRunnable (); // new 스레드 (runnable) .start (); // new 스레드 (runnable) .start (); //} //} // : 实现 Callable 接口 callable <integer> callimplements (new ThreadMplemplements); FutureTask <integer> futuretask = 새로운 FutureTask <> (호출 가능); for (i = 0; i <100; i ++) {system.out.println (thread.currentthread (). getName () + "" + i); if (i == 5) {새 스레드 (FutureTask) .start (); 새 스레드 (FutureTask) .start (); }} try {System.out.println ( "FutureTask Ruturn :" + futureTask.get ()); } catch (예외 e) {e.printstacktrace (); }}}Java a
方法一, 继承自 스레드
public class restrextendsthread는 스레드 {private int i; @override public void run () {for (; i <100; i ++) {System.out.println (getName () + "" + i); }}}run xt xt, rewlextendsThread 对象即为线程对象。
方法二 方法二, 实现 런 가능 接口
공개 클래스 스레드implementsRunnable 구현 실행 가능 {private int i; @override public void run () {for (; i <100; i ++) {system.out.println (thread.currentthread (). getName () + "" + i); }}}run 使用时 使用时, new 一个 스레드 对象 对象, 런닝 가능한 对象作为 대상 传递给 스레드 对象。且同一个 runnable 对象可作为多个 스레드 的 대상, 这些线程均 共 享 runnable 对象的实例变量。
方法三 方法三, 实现 호출 가능 接口
import java.util.concurrent.callable; public class threadimplementscallable 구현 호출 가능 <integer> {private int i; @override public integer call ()는 예외를 {for (; i <100; i ++) {system.out.println (thread.currentthread (). getName () + "" + i); } 반환 i; }}Callable 接口类似于 runnable 接口 接口, 但比对方强大 接口, 线程执行体为 호출 方法, 该方法具有返回值和可抛出异常。使用时将 호출 가능 对象包装为 futuretask 对象 对象, 通过泛型指定返回值类型。可稍候调用 futuretask 的 get 方法取回执行结果。