线程休眠,礼让

线程休眠,礼让

线程休眠
  • sleep(时间)指定当前线程阻塞的毫米值
  • sleep存在异常InterruptedException;
  • sleep时间达到后线程进入就绪状态
  • sleep可以模拟网络延迟(就是在run方法中加一个sleep方法就可以了),倒计时等
  • 每一个对象都有一个锁,sleep不会释放锁;
package com.Jinone.www;

import java.text.SimpleDateFormat;
import java.util.Date;

public class TextStop {
	public static void main(String[] args) {
		//获取当前系统时间
		Date date=new Date(System.currentTimeMillis());
		while(true) {
			try {
				Thread.sleep(1000);
				//设置显示时间格式
				System.out.println(new SimpleDateFormat("yyyy:HH:mm:ss").format(date));
				//更新当前时间
				date=new Date(System.currentTimeMillis());
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
		}
		}
	public static void tenDown() {
		int num=10;
		while(true) {
			try {
				Thread.sleep(1000);
				System.out.println(num--);
				if(num<=0) {
					break;
				}
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
		}
	}
	}
	

线程礼让
  • 线程礼让,让当前正在执行的线程暂停,但不阻塞
  • 将线程从运行状态转为就绪状态
  • 让CPU重新调度,礼让不一定成功!看CPU心情
package com.Jinone.www;

import java.text.SimpleDateFormat;
import java.util.Date;

public class TextStop {
	public static void main(String[] args) {
		new Thread(new MyRunnable(),"a").start();
		new Thread(new MyRunnable(),"b").start();

	}
}


class MyRunnable implements Runnable{

	@Override
	public void run() {
		// TODO Auto-generated method stub
		System.out.println(Thread.currentThread().getName()+"线程开始执行!");
		Thread.yield();
		System.out.println(Thread.currentThread().getName()+"线程停止执行!");
	}
	
}//结果	
//b线程开始执行!
//a线程开始执行!
//a线程停止执行!
//b线程停止执行!
<think>好的,我现在需要回答用户关于如何实现阻塞线程的问题,包括方法、示例代码。首先,我得回忆一下线程阻塞的不同方式。根据已有的知识,线程阻塞通常可以通过几种方法实现,比如使用sleep()、wait()、join()或者锁机制等。用户提供的引用内容里提到了Java中的中断、IO阻塞以及Linux中的阻塞等待线程的例子,这可能帮助我更好地组织回答。 首先,我要确定用户使用的编程语言。问题中用户提到了Java中的线程阻塞方法,但示例代码中有Python的快速排序,不过用户最后的引用都是关于JavaLinux的。可能需要以Java为主,但用户的问题可能不限定语言。不过根据引用内容,用户可能更关注Java,所以需要以Java为例来回答。 接下来,需要列举不同的阻塞方法,并给出每种方法的示例代码。常见的线程阻塞方法包括: 1. Thread.sleep():让线程休眠一段时间。 2. Object.wait():使线程进入等待状态,直到被notify()或notifyAll()唤醒。 3. LockSupport.park():阻塞当前线程,直到许可可用。 4. 使用阻塞队列(如BlockingQueue)的take()方法。 5. 使用join()方法等待其他线程结束。 对于每个方法,需要说明其用途,并提供简单的代码示例。同时,要确保代码符合Java语法,正确展示阻塞的实现。 另外,用户可能需要知道如何唤醒被阻塞的线程。比如,对于wait()方法,需要notify();对于park(),需要unpark();对于sleep(),只能等待时间结束或被中断。这部分信息也需要在回答中提及,可能需要在每个方法中说明如何解除阻塞。 需要注意引用中的内容,比如引用[1]提到中断是唤醒阻塞线程的方法之一,引用[2]涉及线程状态休眠礼让等,引用[3]是关于Linux下线程阻塞的场景。可能需要结合这些引用中的信息,但用户现在的问题是如何实现阻塞,而不是唤醒,不过唤醒方法可以作为补充说明。 需要检查每个方法的正确性,例如,使用wait()时必须持有对象的锁,否则会抛出异常。在代码示例中需要正确展示synchronized块的使用。同样,LockSupport的方法需要正确导入类。 还需要注意线程中断的处理,比如InterruptedException的处理,这在sleep()wait()中都是必须的。代码示例中应该包含try-catch块。 总结步骤: 1. 分点列出不同的阻塞方法。 2. 对每个方法进行简要说明。 3. 提供对应的Java代码示例。 4. 说明如何解除阻塞或可能的中断处理。 5. 确保引用相关的内容,如中断方法,但用户的问题主要是阻塞的实现,所以引用可能作为补充。 现在需要组织语言,确保结构清晰,符合用户要求的“方法 示例 代码”。可能需要使用代码块来展示Java代码,并加上注释说明。同时,按照用户给出的示例,问题部分需要生成相关问题,放在最后。</think>### 如何实现阻塞线程的方法及示例 在编程中,线程阻塞通常用于控制线程执行顺序或等待特定条件。以下是几种常见的实现方法及代码示例: --- #### 1. **使用 `Thread.sleep()` 主动休眠** 通过调用 `Thread.sleep(millis)`,线程会主动进入阻塞状态指定时间。 **示例代码**: ```java public class SleepExample { public static void main(String[] args) { new Thread(() -> { try { System.out.println("线程开始执行"); Thread.sleep(3000); // 阻塞3秒 System.out.println("线程恢复执行"); } catch (InterruptedException e) { e.printStackTrace(); } }).start(); } } ``` **解除阻塞**:休眠时间结束或线程被中断[^1]。 --- #### 2. **通过 `Object.wait()` 等待通知** 在同步代码块中调用 `wait()`,线程会释放锁并进入阻塞状态,直到其他线程调用 `notify()` 或 `notifyAll()`。 **示例代码**: ```java public class WaitNotifyExample { public static void main(String[] args) { Object lock = new Object(); new Thread(() -> { synchronized (lock) { try { System.out.println("线程等待通知"); lock.wait(); // 释放锁并阻塞 System.out.println("线程被唤醒"); } catch (InterruptedException e) { e.printStackTrace(); } } }).start(); new Thread(() -> { synchronized (lock) { lock.notify(); // 发送通知 } }).start(); } } ``` **解除阻塞**:其他线程调用同一对象的 `notify()` 或 `notifyAll()`[^2]。 --- #### 3. **使用 `LockSupport.park()` 暂停线程** `LockSupport` 提供更灵活的阻塞方式,通过 `park()` 暂停线程,`unpark()` 恢复线程。 **示例代码**: ```java import java.util.concurrent.locks.LockSupport; public class LockSupportExample { public static void main(String[] args) { Thread thread = new Thread(() -> { System.out.println("线程即将阻塞"); LockSupport.park(); // 阻塞当前线程 System.out.println("线程恢复执行"); }); thread.start(); try { Thread.sleep(2000); LockSupport.unpark(thread); // 2秒后唤醒线程 } catch (InterruptedException e) { e.printStackTrace(); } } } ``` **解除阻塞**:调用 `LockSupport.unpark(thread)` 或线程被中断。 --- #### 4. **通过 `join()` 等待其他线程结束** 调用 `thread.join()` 会使当前线程阻塞,直到目标线程执行完毕。 **示例代码**: ```java public class JoinExample { public static void main(String[] args) { Thread worker = new Thread(() -> { System.out.println("子线程开始工作"); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("子线程结束工作"); }); worker.start(); try { worker.join(); // 主线程阻塞,直到worker结束 System.out.println("主线程继续执行"); } catch (InterruptedException e) { e.printStackTrace(); } } } ``` **解除阻塞**:目标线程执行完毕。 --- #### 5. **利用阻塞队列 `BlockingQueue`** `BlockingQueue` 的 `take()` 方法会在队列为空时自动阻塞线程,直到队列中有元素。 **示例代码**: ```java import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; public class BlockingQueueExample { public static void main(String[] args) { BlockingQueue<Integer> queue = new ArrayBlockingQueue<>(10); new Thread(() -> { try { System.out.println("尝试获取元素..."); Integer value = queue.take(); // 队列为空时阻塞 System.out.println("获取到元素: " + value); } catch (InterruptedException e) { e.printStackTrace(); } }).start(); new Thread(() -> { try { Thread.sleep(3000); queue.put(42); // 3秒后插入元素,唤醒消费者线程 } catch (InterruptedException e) { e.printStackTrace(); } }).start(); } } ``` **解除阻塞**:队列中有新元素被插入。 --- ### 总结 线程阻塞的核心方法包括休眠、等待通知、锁机制等。选择方法需根据具体场景: - 定时阻塞用 `sleep()`; - 线程协作用 `wait()/notify()`; - 控制线程执行顺序用 `join()`; - 生产者-消费者场景用 `BlockingQueue`。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值