Thread的构造方法
//分配一个新的 Thread对象。 Thread() //分配一个新的 Thread对象。 Thread(Runnable target) //分配一个新的 Thread对象。 Thread(Runnable target, String name) //分配一个新的 Thread对象。 Thread(String name) //分配一个新的 Thread对象。 Thread(ThreadGroup group, Runnable target) //分配一个新的 Thread对象,使其具有 target作为其运行对象,具有指定的 name作为其名称,属于 group引用的线程组。 Thread(ThreadGroup group, Runnable target, String name) //分配一个新的 Thread对象,以便它具有 target作为其运行对象,将指定的 name正如其名,以及属于该线程组由称作 group ,并具有指定的 堆栈大小 。 Thread(ThreadGroup group, Runnable target, String name, long stackSize) //分配一个新的 Thread对象。 Thread(ThreadGroup group, String name)
其中最常用的是空参的构造和传入一个runnable接口这种方式。需要注意的是Thread也实现了Runnable接口,所以也可以传入一个Thread类的对象。
public class Mythread extends Thread{ @Override public void run() { super.run(); System.out.println("myThread"); } } public class TestThread { public static void main(String[] args) { Mythread mythread=new Mythread(); mythread.start(); } }
public class MyRunnable implements Runnable{ @Override public void run() { System.out.println("myRunnable"); } } public class TestThread { public static void main(String[] args) { Thread thread=new Thread(new MyRunnable()); thread.start(); } }
具体是创建Callable接口的实现类,并实现call方法,并且使用FutureTask类来包装Callable实现类的对象,最后把FutureTask对象作为Thread的target来创建线程,如下:
public class MyCallable implements Callable { @Override public Object call() throws Exception { System.out.println("myCallable"); return "hello callable"; } } public class TestThread { public static void main(String[] args) { Callable callable=new MyCallable(); FutureTask futureTask=new FutureTask(callable); Thread thread=new Thread(futureTask); thread.start(); try { Object object = futureTask.get(); //获取call方法的返回值 System.out.println(object); //hello callable }catch (Exception e) { e.printStackTrace(); } } }
以上就是实现多线程的三种方式。
第三种方式之所以可以,是因为FutureTask实现了Runnable接口而已。
可以返回代码段正在被哪个线程调用的信息,如下:
public class Mythread extends Thread{ public Mythread(){ System.out.println("构造:"+Thread.currentThread().getName()); //构造:main } @Override public void run() { super.run(); System.out.println(Thread.currentThread().getName()); //Thread-0 } /** 从运行结果可以看出,Mythread类的构造方法是被main线程调用的,而run方法是被Thread-0线程调用的,run方式是自动调用的方法 */ } public class TestThread { public static void main(String[] args) { Mythread mythread=new Mythread(); mythread.start(); System.out.println(Thread.currentThread().getName()); //main } }