JAVA多线程的测试中的一些心得

今天在测试三种创建多线程的方法时,对这三种方法有一些心得,随便就写了下来

首先是三种多线程的创建方法:

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();
//启动线程(注意不是调用run()方法,直接调用run方法不会创建新的线程)
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();
//将Runnable的实现类的实例作为参数创建Thread实例
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{
//创建Callable的实现对象
MyCallable myCallable = new MyCallable();
//创建FutureTask对象,将Callable实现对象作为参数
FutureTask futureTask = new FutureTask<>(myCallable);
//创建线程对象,将FutureTask对象作为参数
Thread thread = new Thread(futureTask);
//启动线程
thread.start();
//获取线程的返回值
Object obj = futureTask.get();
}

注意:通过这种方式创建多个Thread实例来创建多个线程时使用的是同一个Callable实例,且这种方式会在线程结束时返回数据,数据类型可以为任意类型

</font

在测试中,通过继承Thread和实现Runnable来创建线程在测试方法中与主线程同时抢占cpu资源,且主线程不会等待子线程结束,而在main方法中,以及实践运用时,所有创建线程的方法中,主线程都与子线程分离,即两个线程没有关联

实现FutureTask创建线程如果需要获取返回值,主线程会等待子线程结束后才能获取返回值,所以在测试类中主线程会等待子线程


Comments: