多线程笔记2:

五、线程调度
线程的调度
1、调整线程优先级:Java线程有优先级,优先级高的线程会获得较多的运行机会。
Java线程的优先级用整数表示,取值范围是1~10,Thread类有以下三个静态常量:
static int MAX_PRIORITY
线程可以具有的最高优先级,取值为10。
static int MIN_PRIORITY
线程可以具有的最低优先级,取值为1。
static int NORM_PRIORITY
分配给线程的默认优先级,取值为5。

Thread类的setPriority()和getPriority()方法分别用来设置和获取线程的优先级。

每个线程都有默认的优先级。主线程的默认优先级为Thread.NORM_PRIORITY。
线程的优先级有继承关系,比如A线程中创建了B线程,那么B将和A具有相同的优先级。

2、线程睡眠:Thread.sleep(long millis)方法,使线程转到阻塞状态。millis参数设定睡眠的时间,以毫秒为单位。当睡眠结束后,就转为就绪(Runnable)状态。sleep()平台移植性好。

3、线程等待:Object类中的wait()方法,导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 唤醒方法。这个两个唤醒方法也是Object类中的方法,行为等价于调用 wait(0) 一样。

4、线程让步:Thread.yield() 方法,暂停当前正在执行的线程对象,把执行机会让给相同或者更高优先级的线程。

5、线程加入:join()方法,等待其他线程终止。在当前线程中调用另一个线程的join()方法,则当前线程转入阻塞状态,直到另一个进程运行结束,当前线程再由阻塞转为就绪状态。

6、线程唤醒:Object类中的notify()方法,唤醒在此对象监视器上等待的单个线程。

守护线程
可以通过调用
t.setDaemon(true);
将线程转换为守护线程(daemon thread。)守护线程的唯一用途是为其他线程提供服务。

线程中断
• void interrupts)
向线程发送中断请求。线程的中断状态将被设置为 true。如果目前该线程被一个 sleep调用阻塞,那么,InterruptedException 异常被抛出。
•static boolean interrupted()
测试当前线程(即正在执行这一命令的线程)是否被中断。注意,这是一个静态方法。这一调用会产生副作用—它将当前线程的中断状态重置为 false。
• boolean islnterrupted()
测试线程是否被终止。不像静态的中断方法,这一调用不改变线程的中断状态。 •static Thread currentThread()
返回代表当前执行线程的 Thread 对象。

线程同步:
线程安全: 同步是用来解决多线程的安全问题的。

线程不安全:在多线程中,同步能控制对共享数据的访问。如果没有同步,当一个线程在 修改一个共享数据时,而另外一个线程正在使用或者更新同一个共享数据,这样容易导致程序出现错误的结果。

锁:锁就是对象。锁的作用是保证线程同步,解决线程安全问题。

持有锁的线程可以在同步中执行,没有锁的线程即使获得cpu执行权,也进不去。

13、同步的前提:

(1)必须保证有两个以上线程

(2)必须是多个线程使用同一个锁,即多条语句在操作线程共享数据

(3)必须保证同步中只有一个线程在运行

14、同步的好处和弊端

好处:同步解决了多线程的安全问题

弊端:多线程都需要判断锁,比较消耗资源

15、同步的两种表现形式:

(1)同步代码块:

可以指定需要获取哪个对象的同步锁,使用synchronized的代码块同样需要锁,但他的锁可以是任意对象

考虑到安全问题,一般还是使用同一个对象,相对来说效率较高。

注意:

**虽然同步代码快的锁可以使任何对象,但是在进行多线程通信使用同步代码快时,

必须保证同步代码快的锁的对象和,否则会报错。

**同步函数的锁是this,也要保证同步函数的锁的对象和调用wait、notify和notifyAll的对象是

同一个对象,也就是都是this锁代表的对象。

格式:

synchronized(对象)

{

需同步的代码;

}

(2)同步函数

同步方法是指进入该方法时需要获取this对象的同步锁,在方法上使用synchronized关键字,

使用this对象作为锁,也就是使用了当前对象,因为锁住了方法,所以相对于代码块来说效率相对较低。

注:静态同步函数的锁是该方法所在的类的字节码文件对象,即类名.class文件

格式:

修饰词 synchronized 返回值类型 函数名(参数列表)

{

需同步的代码;

}
显示锁、公平锁与非公平锁、死锁:
显示锁:Look类的子类ReentrantLook
步骤(1)new对象,创建锁 Look l = new ReentrantLook();
(2)调用look方法。 l.look();
(3)执行条件语句完毕、放开锁 l.unlook();
公平锁:fair参数为true就表示公平锁,排队,先来先得
死锁:两个线程对两个同步对象具有循环依赖时,就会发生死锁。

多线程通信:

在同步代码块中, 使用锁对象的wait()方法可以让当前线程等待, 直到有其他线程唤醒为止.

使用锁对象的notify()方法可以唤醒一个等待的线程,或者notifyAll唤醒所有等待的线程.

Runnable 与 Callable
Callable使用步骤
Runnable 与 Callable的相同点
都是接口
都可以编写多线程程序
都采用Thread.start()启动线程
Runnable 与 Callable的不同点
Runnable没有返回值;Callable可以返回执行结果
Callable接口的call()允许抛出异常;Runnable的run()不能抛出
Callable获取返回值
Callalble接口支持返回执行结果,需要调用FutureTask.get()得到,此方法会阻塞主进程的继续往下执行,如果不调用不会阻塞。

线程池 Executors

Java中的四种线程池:1. 缓存线程池2. 定长线程池3. 单线程线程池4. 周期性任务定长线程池

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值