今天在测试三种创建多线程的方法时,对这三种方法有一些心得,随便就写了下来
首先是三种多线程的创建方法:
1.1通过创建类来继承Thread类创建线程
1 2 3 4 5 6 7
| public class MyThread extends Thread { @Override public void run() { } }
|
1.2启动该线程,让它拥有能获得cpu资源的资格
1 2 3 4 5 6 7 8 9 10 11 12
| @Test public void testThread() throws Exception{ MyThread myThread1 = new MyThread(); MyThread myThread2 = new MyThread(); MyThread myThread3 = new MyThread(); myThread.start(); myThread2.start(); myThread3.start(); }
|
注意:通过这种方式创建多个Thread实例来创建多个线程时使用的是不同的Thread实例
2.1通过创建类来实现Runnable接口创建线程
1 2 3 4 5 6 7
| public class MyRunnable implements Runnable { @Override public void run() { } }
|
2.2启动该线程,让它拥有能获得cpu资源的资格
1 2 3 4 5 6 7 8 9 10
| @Test public void testRunnable() throws Exception{ MyRunnable myRunnable = new MyRunnable(); Thread thread = new Thread(myRunnable); thread.start(); }
|
注意:通过这种方式创建多个Thread实例来创建多个线程时使用的是同一个Runnable实例
3.1实现Callable接口创建线程
1 2 3 4 5 6 7 8
| public class MyCallable implements Callable { @Override public Object call() { return null; } }
|
3.2启动该线程,让它拥有能获得cpu资源的资格
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| @Test public void testCallable() throws Exception{ MyCallable myCallable = new MyCallable(); FutureTask futureTask = new FutureTask<>(myCallable); Thread thread = new Thread(futureTask); thread.start(); Object obj = futureTask.get(); }
|
注意:通过这种方式创建多个Thread实例来创建多个线程时使用的是同一个Callable实例,且这种方式会在线程结束时返回数据,数据类型可以为任意类型
</font
在测试中,通过继承Thread和实现Runnable来创建线程在测试方法中与主线程同时抢占cpu资源,且主线程不会等待子线程结束,而在main方法中,以及实践运用时,所有创建线程的方法中,主线程都与子线程分离,即两个线程没有关联
实现FutureTask创建线程如果需要获取返回值,主线程会等待子线程结束后才能获取返回值,所以在测试类中主线程会等待子线程