欢迎访问宙启技术站
智能推送

如何使用Java中的Thread创建和启动多线程程序?

发布时间:2023-06-22 10:27:03

在Java中,使用Thread类来创建和启动多线程程序。Thread类是一个内置类,提供了一组方法,用于控制和管理线程。多线程程序可以同时执行多个功能,提高系统的效率和性能。

1. 创建多线程

Java中创建多线程可以有两种方式:继承Thread类和实现Runnable接口。继承Thread类需要重写run()方法,实现Runnable接口需要实现run()方法。

a. 继承Thread类

public class MyThread extends Thread {
    @Override
    public void run() {
        //线程执行的逻辑
    }
}

//创建和启动线程
MyThread myThread = new MyThread();
myThread.start();

b. 实现Runnable接口

public class MyRunnable implements Runnable {
    @Override
    public void run() {
        //线程执行的逻辑
    }
}

//创建和启动线程
MyRunnable myRunnable = new MyRunnable();
Thread thread = new Thread(myRunnable);
thread.start();

2. 启动多线程

启动多线程的方式有两种:调用start()方法和run()方法。调用start()方法会创建新的线程执行run()方法,而直接调用run()方法会在当前线程中执行run()方法。

public class MyThread extends Thread {
    @Override
    public void run() {
        System.out.println("线程开始执行");
    }
}

//创建和启动线程
MyThread myThread = new MyThread();
myThread.start(); //调用start方法
myThread.run(); //调用run方法

3. 线程的状态

线程有不同的状态,在不同的状态下线程可以进行不同的操作。Java提供了一些方法来获取线程的状态。

a. 新建状态(New):在创建线程对象后,线程处于新建状态,还没有开始执行。

b. 就绪状态(Runnable):调用start()方法后,线程进入就绪状态,可以被JVM调度执行。

c. 运行状态(Running):线程进入运行状态,执行run()方法。

d. 阻塞状态(Blocked):线程进入阻塞状态,等待一些条件满足(如等待输入输出)。

e. 等待状态(Waiting):线程进入等待状态,等待其他线程通知或中断。

f. 完成状态(Terminated):线程执行完成后进入完成状态。

public class ThreadStateDemo {
    public static void main(String[] args) {
        Thread t = new Thread(() -> {
            System.out.println("线程运行状态");
        });
        System.out.println("线程新建状态");
        System.out.println("线程状态:" + t.getState());
        t.start();
        System.out.println("线程就绪状态");
        System.out.println("线程状态:" + t.getState());
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("线程运行状态");
        System.out.println("线程状态:" + t.getState());
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("线程完成状态");
        System.out.println("线程状态:" + t.getState());
    }
}

4. 线程的常用方法

a. join()方法:等待线程执行完成再执行下面的逻辑。

Thread t = new Thread(() -> {
    System.out.println("线程运行状态");
});
t.start();
try {
    t.join(); //等待线程执行完成
} catch (InterruptedException e) {
    e.printStackTrace();
}
System.out.println("主线程继续执行");

b. sleep()方法:使当前线程休眠一段时间。

Thread t = new Thread(() -> {
    try {
        Thread.sleep(1000); //线程休眠1秒
        System.out.println("线程运行状态");
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
});
t.start();
try {
    Thread.sleep(2000); //主线程休眠2秒
} catch (InterruptedException e) {
    e.printStackTrace();
}
System.out.println("主线程继续执行");

c. interrupt()方法:中断线程的执行,抛出InterruptedException异常。

Thread t = new Thread(() -> {
    while (true) {
        if (Thread.currentThread().isInterrupted()) { //检测线程是否被中断
            System.out.println("线程中断");
            break;
        }
        System.out.println("线程运行状态");
    }
});
t.start();
try {
    Thread.sleep(1000);
} catch (InterruptedException e) {
    e.printStackTrace();
}
System.out.println("主线程中断线程");
t.interrupt(); //中断线程

d. setPriority()方法:设置线程的优先级。

Thread t1 = new Thread(() -> {
    System.out.println("线程A优先级:" + Thread.currentThread().getPriority());
});
t1.setPriority(Thread.MIN_PRIORITY); //设置优先级为最低
t1.start();

Thread t2 = new Thread(() -> {
    System.out.println("线程B优先级:" + Thread.currentThread().getPriority());
});
t2.setPriority(Thread.MAX_PRIORITY); //设置优先级为最高
t2.start();

e. yield()方法:让出CPU执行权。

Thread t1 = new Thread(() -> {
    for (int i = 0; i < 5; i++) {
        System.out.println("线程A执行");
        Thread.yield(); //线程A让出CPU执行权
    }
});
t1.start();

Thread t2 = new Thread(() -> {
    for (int i = 0; i < 5; i++) {
        System.out.println("线程B执行");
        Thread.yield(); //线程B让出CPU执行权
    }
});
t2.start();

f. wait()方法和notify()方法:线程间的通信。

public class ThreadCommunicationDemo {
    public static void main(String[] args) {
        Object lock = new Object();
        Thread t1 = new Thread(() -> {
            synchronized (lock) {
                try {
                    System.out.println("线程A等待");
                    lock.wait(); //线程A等待通知
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("线程A收到通知");
            }
        });
        t1.start();

        Thread t2 = new Thread(() -> {
            synchronized (lock) {
                System.out.println("线程B通知");
                lock.notify(); //线程B发送通知
            }
        });
        t2.start();
    }
}

以上是Java中使用Thread类创建和启动多线程的基本方法和常用操作,利用多线程可以提高资源利用率,增加程序执行效率。同时需要注意线程同步和线程安全,避免出现线程安全问题导致程序异常或崩溃。