本文已参与「新人创作礼」活动,一起开启掘金创作之路。
一、继承Thread类创建多线程
单线程
因为该程序是一个单线程程序,所以只会循环run()方法的死循环。
单线程程序
public class ExampleM01 {
public static void main(String[] args) {
MyThread myThread =new MyThread(); //创建 MyThread 实例对象
myThread.run(); //调用 MyThread类的 run()方法
while (true) { //该循环是个死循环,打印输出语句
System.out.println("Main方法在运行");
}
}
}
class MyThread {
public void run() {
while (true) { //该循环是个死循环,打印输出语句
System.out.println("MyThread 类的 run()方法在运行");
}
}
}
多线程
JDK 中提供了一个线程类 Thread ,通过继承 Thread 类,并重写 Thread 类中的 run ()方法便可实现多线程。
在 Thread 类中,提供了一个 start()方法用于启动新线程,线程启动后,系统会自动调用 run()方法。
多线程程序
public class ExampleM02 {
public static void main(String[] args) {
MyThread02 myThread =new MyThread02(); //创建 MyThread 线程对象
myThread.start(); //开启线程
while (true) { //该循环是个死循环,打印输出语句
System.out.println("Main()方法在运行");
}
}
}
class MyThread02 extends Thread{
public void run() {
while (true) { //该循环是个死循环,打印输出语句
System.out.println("MyThread 类的 run()方法在运行");
}
}
}
单线程和多线程区别
二、线程休眠 sleep()
如果希望人为地控制线程,使正在执行的线程暂停,将 CPU 让给别的线程,这时可以使用静态方法 sleep ( long millis ),该方法可以让当前正在执行的线程暂停一段时间,进人休眠等待状态。sleep ( long millis )方法声明抛出InterruptedException 异常,因此在调用该方法时应该捕获异常,或者声明抛出该异常。
案例 ExampleM08:
public class ExampleM08 {
public static void main(String[] args) throws Exception{
//创建一个线程
new Thread(new SleepThread()).start();
for (int i=1;i<=10;i++) {
if (i==5) {
Thread.sleep(2000); //当前线程休眠 2秒
}
System.out.println("主线程正在输出:"+i);
Thread.sleep(500); //当前线程休眠 500毫秒
}
}
}
//定义 SleepThread类实现 Runnable接口
class SleepThread implements Runnable {
public void run() {
for (int i=1;i<=10;i++) {
if (i==3) {
try {
Thread.sleep(2000); //当前线程休眠 2秒
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("线程一正在输出:"+i);
try {
Thread.sleep(500); //当前线程休眠 500毫秒
}catch (Exception e) {
e.printStackTrace();
}
}
}
}
在线程一的 for 循环中,当i=3时,调用了 Thread 的 sleep (2000)方法(代码的第20行左右),使线程休眠2s。从运行结果可以看出,主线程输出2后,线程一没有交替输出3,而是主线程接着输出了3和4,这说明了线程一进人了休眠等待状态。
在主线程的 for 循环中,当i=5时,也调用了 Thread 的 sleep (2000)方法(代码的第7行左右),使线程休眠2s。从运行结果可以看出,在主线程输出4后,下面连续4句话都是线程一输出的。只有当主线程2s休眠完毕后,两个线程才会恢复交替执行。
需要注意的是,sleep()是静态方法,只能控制当前正在运行的线程休眠,而不能控制其他程序休眠。当休眠时间结束后,线程就会返回到就绪状态,而不是立即开始运行。