基本概念:
在Java中,多线程是一种并发编程的机制,它允许同时执行多个线程的代码片段,
1.线程:解释了线程的定义和特点,以及与进程的区别。
2.并发和并行:展示并发和并行的区别,说明多线程如何实现并发执行。
3.线程调度与生命周期:介绍线程调度器以及线程的各种状态,如新建状态、就绪状态、运行状态、阻塞状态和终止状态。
创建线程:
了解如何在Java中创建线程是入门多线程编程的第一步。以下是两种常用的创建线程的方法:
1.继承Thread类:创建一个继承自Thread的子类,并重写其中的run()方法。
class MyThread extends Thread {
public void run() {
// 线程执行的逻辑
}
}
// 创建并启动线程
MyThread thread = new MyThread();
thread.start();
2.实现Runnable接口:实现Runnable接口,并将其对象作为参数传递给Thread类的构造函数。
class MyRunnable implements Runnable {
public void run() {
// 线程执行的逻辑
}
}
// 创建并启动线程
Thread thread = new Thread(new MyRunnable());
thread.start();
启动线程:
启动线程的过程非常简单,只需调用线程对象的start()方法。
Thread thread = new Thread(new MyRunnable());
thread.start();
在调用start()方法后,线程将开始执行,并自动调用run()方法。
线程同步:
当多个线程访问共享资源时,可能会出现数据不一致或冲突的问题。了解线程同步和互斥是确保多线程程序正确运行的关键。
1.同步代码块:使用synchronized关键字对需要同步访问的代码进行包围。
synchronized (object) {
// 需要同步的代码
}
2.同步方法:使用synchronized关键字修饰方法,使整个方法成为同步代码块
public synchronized void myMethod() {
// 需要同步的代码
}
基本方法:
1.start():启动线程。当调用该方法时,线程将开始执行,并自动调用线程对象的 run() 方法。
public class ThreadDemo {
public static void main(String[] args) {
MyThread t1 =new MyThread("a");
MyThread t2 =new MyThread("b");
t1.start();
t2.start();
}
}
2.run():线程的执行逻辑。在该方法中定义线程要执行的操作。需要注意的是,直接调用 run() 方法将会以普通的方法调用方式执行,并不会启动新的线程。
3.sleep(long millis):使线程休眠指定的时间,以毫秒为单位。该方法会让当前线程暂停执行,但不会释放占用的资源,指定的休眠时间过后,线程会继续执行。
public class MyThread implements Runnable {
@Override
public void run() {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
4.join():等待线程终止。调用该方法的线程将会进入阻塞状态,直到被调用的线程执行完毕。可以使用带参数的 join(long millis) 方法来指定最长等待时间。
public class ThreadDemo {
public static void main(String[] args) throws InterruptedException {
/*
public final void join() 插入线程/插队线程
*/
MyThread t =new MyThread();
t.setName("a");
t.start();
t.join();
for (int i = 0; i < 10; i++) {
System.out.println("main线程"+" "+i);
}
}
}
5.yield():暂停当前线程的执行,让系统调度器选择其他线程执行。该方法的使用可以让同优先级的线程有机会执行,但并不能保证起到绝对的作用。
public class MyThread extends Thread{
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println(getName() + " "+i);
//表示出让当前cpu的控制权
Thread.yield();
}
}
}