Thread

wait()与notify()

就和每个Java 对象都有与其相关联的锁一样,每个对象都可以维持等待线程列表。当线程调用对象的wait() method 时,线程所占有的每一个锁都会被暂时释放,而线程会被加到那个对象的等待线程列表并停止运行。当另一个线程调用同一个对象的notifyAll() method 时,对象就会唤醒等待的线程并允许它们继续运行

 

/**

 * 一个队列。有个线程会调用push()来把一个对象插入队列。

 * 另一个线程会调用pop()将对象从队列取出。如果没有数据,pop()就

 * 会等待,直到有数据为止。这里所使用的是wait()/notify()。

 *wait()和notify()必须被使用在synchronized method或程序块中。在Java 5.0

 * 中,要用java.util.concurrent.BlockingQueue来代替

 */

public class WaitingQueue<E> {

   LinkedList<E> q = new LinkedList<E>();  // 存储对象的地方

    public synchronized void push(E o) {

       q.add(o);         // 将对象添加到列表的末尾

       this.notifyAll(); // 告诉等待中的线程,数据已准备好

    }

   public synchronized E pop() {

       while(q.size() == 0) {

           try { this.wait(); }

           catch (InterruptedException ignore) {}

       }

       return q.remove(0);

    }

}

join()

有时一个线程必须停止并等待另一个线程完成。你可以用join() method 来完成

List list; // 要被排序的详细列表;已在其他地方初始化

// 定义线程来排序列表:降低其优先级,以让它只

// 有在当前线程在等待I/O 时才开始运行

Thread sorter = newBackgroundSorter(list);               // 先前已定义

sorter.setPriority(Thread.currentThread.getPriority()-1);// 降低优先级

sorter.start();                                           // 开始排序

// 同时,在原先的线程中从文件中读取数据

byte[] data = readData();  // 在其他地方定义的method

// 在能继续处理之前,列表需已被彻底排序,所以如果sorter线程

// 还没完成,则我们必须等它结束

try { sorter.join(); }catch(InterruptedException e) {}


对象锁针对整个对象,当某个线程执行a方法获取对象锁,在a()未执行完之前,该对象处于锁定状态,其他线程无法再执行a方法或b方法
public class TS {
synchronized public void a() throws InterruptedException{
String name = Thread.currentThread().getName();
System.out.println(name+":   a()");
Thread.sleep(10000);

}

synchronized public void b(){
String name = Thread.currentThread().getName();
System.out.println(name+":   b()");
for(int i=0;i<1000;i++);

}
}

Thread 类是 JVM 用于管理线程的类,每个线程都有一个 Thread 对象与之关联,JVM 会将这些 Thread 对象组织起来,用于线程调度和管理[^2]。 ### 功能与特性 Thread 对象具有 ID、名称、优先级、状态等属性,这些属性被 JVM 用于线程的调度和管理。在多线程环境下,根据多线程的内存原理,会开辟包含主线程的多个栈空间供 CPU 执行不同线程,不过线程执行的优先级通常由 CPU 决定,用户较难控制[^2][^3]。 ### 常见构造方法 - `Thread()`:创建一个线程对象。 - `Thread(Runnable target)`:使用 Runnable 对象创建线程对象。 - `Thread(String name)`:创建线程对象,并为其命名。 - `Thread(Runnable target, String name)`:使用 Runnable 对象创建线程对象,并为其命名[^2]。 ### 使用方法 #### 线程创建 - **继承 Thread 类,重写 run 方法** ```java class MyThread extends Thread { @Override public void run() { System.out.println("继承 Thread 类创建的线程在执行"); } } // 使用示例 MyThread thread = new MyThread(); thread.start(); ``` - **实现 Runnable 接口,重写 run 方法** ```java class MyRunnable implements Runnable { @Override public void run() { System.out.println("实现 Runnable 接口创建的线程在执行"); } } // 使用示例 Runnable runnable = new MyRunnable(); Thread thread = new Thread(runnable); thread.start(); ``` - **继承 Thread 类,重写 run 方法,使用匿名内部类** ```java Thread thread = new Thread() { @Override public void run() { System.out.println("使用匿名内部类继承 Thread 类创建的线程在执行"); } }; thread.start(); ``` - **实现 Runnable 接口,重写 run 方法,使用匿名内部类** ```java Runnable runnable = new Runnable() { @Override public void run() { System.out.println("使用匿名内部类实现 Runnable 接口创建的线程在执行"); } }; Thread thread = new Thread(runnable); thread.start(); ``` - **使用 lambda 表达式(最推荐)** ```java Thread thread = new Thread(() -> { System.out.println("使用 lambda 表达式创建的线程在执行"); }); thread.start(); ``` #### 线程中断 - **使用标志位来控制线程是否要停止** ```java class MyThread extends Thread { private volatile boolean isStopped = false; @Override public void run() { while (!isStopped) { System.out.println("线程正在执行"); } System.out.println("线程已停止"); } public void stopThread() { isStopped = true; } } // 使用示例 MyThread thread = new MyThread(); thread.start(); thread.stopThread(); ``` - **使用 Thread 自带的标志位来控制线程是否要停止** ```java Thread thread = new Thread(() -> { while (!Thread.currentThread().isInterrupted()) { System.out.println("线程正在执行"); } System.out.println("线程已停止"); }); thread.start(); thread.interrupt(); ``` #### 线程等待 在 Java 中,可以使用 `join()` 方法让一个线程等待另一个线程执行完毕。例如: ```java Thread thread1 = new Thread(() -> { try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("线程 1 执行完毕"); }); Thread thread2 = new Thread(() -> { try { thread1.join(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("线程 2 在等待线程 1 执行完毕后执行"); }); thread1.start(); thread2.start(); ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值