线程调度的常用方法

线程的相关方法基本可以分为以下几类:

类别方法
等待wait()
wait(long timeout)
wait(long timeout, int nanos)
join()
join(long timeout)
join(long timeout, int nanos)
通知(唤醒)notify()
notifyAll()
让出优先权yield()
中断interrupt()
interruptted()
isInterrupted()
休眠sleep()

wait():当一个线程 A 调用一个共享变量的 wait() 方法时,线程 A 会被阻塞挂起, 发生下面两种情况才会返回 :(1)其它线程调用了共享对象的 notify() 或者 notifyAll() 方法;(2)其他线程调用了线程 A 的 interrupt() 方法,线程 A 抛出 InterruptedException 异常返回。

wait(long timeout):这个方法相比 wait() 方法多了一个超时参数,它的不同之处在于,如果线程 A 调用共享对象的 wait(long timeout) 方法后,没有在指定的 timeout 时间(单位:毫秒)内被其它线程唤醒,那么这个方法还是会因为超时而返回。

wait(long timeout, int nanos):其内部调用的是 wait(long timeout) 方法。源码为:

public final void wait(long timeout, int nanos) throws InterruptedException {
    if (timeout < 0) {
        throw new IllegalArgumentException("timeout value is negative");
    }
    if (nanos < 0 || nanos > 999999) {
        throw new IllegalArgumentException(
                            "nanosecond timeout value out of range");
    }
    if (nanos > 0) {
        timeout++;
    }
    wait(timeout);
}

以上这三种方法是线程等待的方法,这三个方法都是 Object 类中的。

notify():一个线程 A 调用共享对象的 notify() 方法后,会唤醒一个在这个共享变量上调用 wait 系列方法后被挂起的线程。一个共享变量上可能会有多个线程在等待,具体唤醒哪个等待的线程是随机的。

notifyAll():不同于在共享变量上调用 notify() 方法会唤醒被阻塞到该共享变量上的一个线程,notifyAll() 方法则会唤醒所有在该共享变量上由于调用 wait 系列方法而被挂起的线程。

这两个方法都是 Object 类中提供的,除了这两个方法之外,Thread 类也提供了一系列线程唤醒的方法。

join()、join(long timeout)、join(long timeout, int nanaos):如果一个线程 A 执行了 thread.join() 语句,其含义是:当前线程 A 等待 thread 线程终止之后才会从 thread.join() 返回。join() 就相当于 join(0),join(log timeout, int nanos) 内部其实也是调用了 join(long timeout) 方法。

yield():Thread 类中的静态方法,当一个线程调用 yield() 方法时,实际就是在暗示线程调度器当前线程请求让出自己的 CPU ,但是线程调度器可以无条件忽略这个暗示。

sleep(long millis):线程睡眠的方法。Thread 类中的静态方法,当一个执行中的线程 A 调用了 Thread 的 sleep() 方法后,线程 A 会暂时让出指定时间的执行权,但是线程 A 所拥有的监视器资源,比如锁还是持有不让出的。指定的睡眠时间到了后该函数会正常返回,接着参与 CPU 的调度,获取到 CPU 资源后就可以继续运行。

Java 中的线程中断是一种线程间的协作模式,通过设置线程的中断标志并不能直接终止该线程的执行,而是被中断的线程根据中断状态自行处理。

interrupt():中断线程,例如,当线程 A 运行时,线程 B 可以调用线程 interrupt() 方法来设置线程的中断标志为 true 并立即返回。设置标志仅仅是设置标志, 线程 A 实际并没有被中断, 会继续往下执行。

isInterrupted():检测当前线程是否被中断。

interrupted():检测当前线程是否被中断,与 isInterrupted() 不同的是,该方法如果发现当前线程被中断,则会清除中断标志。

本文参考自:面渣逆袭:Java并发六十问,快来看看你会多少道! - 掘金

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 当多个线程需要访问共享资源时,可能会发生竞争条件,导致程序出现错误或意外结果。此时可以使用互斥锁来保护共享资源,确保每个线程在访问共享资源时都是独占的。 互斥锁是一种同步原语,它提供了对共享资源的独占访问。使用互斥锁时,只有一个线程可以获得锁,其他线程必须等待该线程释放锁后才能获得锁。这样可以确保同一时刻只有一个线程访问共享资源,避免了竞争条件。 下面是一个使用互斥锁调度线程的示例代码: ```python import threading # 定义共享资源 shared_resource = [] # 定义互斥锁 mutex = threading.Lock() # 定义线程函数 def thread_func(): global shared_resource # 获得互斥锁 mutex.acquire() # 访问共享资源 shared_resource.append(threading.current_thread().name) # 释放互斥锁 mutex.release() # 创建多个线程 threads = [] for i in range(5): t = threading.Thread(target=thread_func) threads.append(t) # 启动所有线程 for t in threads: t.start() # 等待所有线程执行完毕 for t in threads: t.join() # 输出共享资源 print(shared_resource) ``` 在上面的示例代码中,我们定义了一个共享资源列表 shared_resource 和一个互斥锁 mutex。然后定义了一个线程函数 thread_func,在该函数中,我们首先获得互斥锁,然后访问共享资源,最后释放互斥锁。在主程序中,我们创建了多个线程并启动它们,最后输出共享资源,可以看到所有线程访问共享资源的顺序是互斥的。 ### 回答2: 使用互斥锁来调度线程是一种常用方法,其目的是保证多个线程对共享资源的访问互斥,从而避免竞态条件的发生。 互斥锁是操作系统提供的一种机制,用来保护共享资源。当一个线程获得了互斥锁后,其他线程就无法再获得该锁,只有当前线程释放了锁,其他线程才能继续竞争锁的使用权。 在使用互斥锁调度线程时,首先需要创建一个互斥锁对象,并在共享资源的关键位置使用锁来保护。当某个线程需要访问共享资源时,它会先尝试获得互斥锁,如果获得成功,则可以访问共享资源,完成后释放锁;如果获得失败,则必须等待其他线程释放锁后再次竞争获取。 互斥锁的使用可以有效避免多线程对共享资源的并发访问问题,确保同一时间只有一个线程在访问。这样可以维护共享资源的稳定性和一致性,避免数据错乱和不一致的情况发生。同时,互斥锁也能够提高程序的并发执行效率,减少了资源竞争带来的性能损失。 然而,过多地使用互斥锁也可能会造成线程的阻塞和等待,降低程序的并发性能。因此,在使用互斥锁时需要合理地选择加锁的地方,尽量减少互斥锁的竞争频率。另外,也可以考虑使用其他线程同步机制,如读写锁、条件变量等,来更好地满足程序的并发需求。 ### 回答3: 互斥锁是一种用于线程同步的机制,它可以用来确保在同一时间只有一个线程访问共享资源。在多线程环境下,使用互斥锁可以实现线程的调度和控制。 当多个线程需要访问共享资源时,可以先创建一个互斥锁,并将其设置为未锁定状态。每个线程在访问共享资源之前,首先尝试获取互斥锁。如果成功获取到锁,说明没有其他线程正在访问该资源,那么当前线程可以继续执行操作。如果获取锁失败,则说明有其他线程正在访问该资源,当前线程会进入等待状态,直到其他线程释放锁。 通过使用互斥锁,可以保证同一时间只有一个线程访问共享资源,避免了多个线程同时读写导致的数据不一致和线程冲突的问题。互斥锁可以实现线程的有序执行,提高了程序的安全性和可靠性。 在使用互斥锁进行线调度时,需要注意以下几点: 1. 在访问共享资源之前,要先获得互斥锁,执行完成后再释放锁,确保每次只有一个线程在执行关键代码段。 2. 在代码设计时,要考虑互斥锁的粒度,粒度过细会导致频繁加锁解锁,降低性能;粒度过大则无法充分利用多线程并发性能。 3. 需要注意互斥锁的超时问题,避免线程出现死锁状态。 4. 在使用互斥锁时,需要确保锁的正确性和一致性,防止出现死锁和饥饿等问题。 总的来说,使用互斥锁是一种有效的调度线程的方法,可以保证共享资源的正确性和线程的有序执行,提高程序的并发性和稳定性。同时,在实际应用中,还需要根据具体的情况选择合适的调度策略和锁的机制,以达到最佳的性能和效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值