这篇开始学习线程相关代码知识,本篇开始介绍线程类Thread的基本使用方法,也就是通过调用start()方法去启动多线程。
1.API基本内容
在JDK API文档中,搜索并打开Thread类。可以发现Thread类在lang包下,所以不需要导入包。可以找到这么一句话:创建新执行线程有两种方法。一种方法是将类声明为 Thread
的子类。该子类应重写 Thread
类的 run
方法。接下来可以分配并启动该子类的实例。本篇就来介绍第一种方法实现多线程。
2.执行Thread类的子类对象调用run方法,是真的实现了多线程吗?
一种方法是将类声明为 Thread
的子类。该子类应重写 Thread
类的 run
方法。接下来可以分配并启动该子类的实例。根据这句话,我们来写代码,就是先创建一个Thread类的子类实例对象,然后实例调用run方法,看看是不是实现了多线程。
package thread;
public class Demo1_Thread {
public static void main(String[] args) {
MyThread mt = new MyThread(); //4.创建Thread类子类对象
mt.run(); //5.调用run方法
for (int i = 0; i < 1000; i++) { //6.添加第二个线程,作为参考
System.out.println("bbbbb");
}
}
}
/**
* 创建一个Thread类的子类,并重写run方法
*/
class MyThread extends Thread { //1创建Thread类子类
public void run() { //2重写run方法
//随便写一些代码
for (int i = 0; i < 1000; i++) { //3.将要执行的方法写在run方法中
System.out.println("aaaaaaa");
}
}
}
运行之后,发现输出结果是,先全部输出aaaa,然后全部输出bbbb,并没有看到多线程的输出效果。因为如果是发生了多线程,肯定是输出aaaa和输出bbbb是交替的效果。为什么是这样效果呢,看来并没有实现多线程。继续看API文档,上面说,调用start()方法才执行多线程任务。
3.调用start()方法启动多线程执行
在API文档,下拉,找到start()方法。在start()方法上面可以看到sleep方法,这个我们在自动化测试中经常使用Thread.sleep(2000),这个线程等待。start()方法的作用是:使该线程开始执行;Java 虚拟机调用该线程的 run
方法。所以,触发多线程任务的方法是start()而不是run(),而且start()方法执行过程会自动调用run方法。修改代码如下:
package thread;
public class Demo1_Thread {
public static void main(String[] args) {
MyThread mt = new MyThread(); //4.创建Thread类子类对象
mt.start(); //5.调用run方法
for (int i = 0; i < 1000; i++) { //6.添加第二个线程,作为参考
System.out.println("bbbbb");
}
}
}
/**
* 创建一个Thread类的子类,并重写run方法
*/
class MyThread extends Thread { //1创建Thread类子类
public void run() { //2重写run方法
//随便写一些代码
for (int i = 0; i < 1000; i++) { //3.将要执行的方法写在run方法中
System.out.println("aaaaaaa");
}
}
}
运行上面代码之后,可以看到输出a和输出b是交替出现的,说明发生了多线程执行过程。这里需要注意,循环最好设置1000以上,才好看到交替打印效果,否则cpu执行太快,你都认为没有采用多线程执行。