Java中如何正确停止线程?
不能用stop(),
应该使用退出标志(正确退出线程)
interrupt():中断线程,并不能正确停止线程
volatile保证了线程可以正确的读取其他线程写入的值。
常用的方法
yield();使用此方法,当执行到它的时候,当前线程就会释放对cpu的执行权,但是下一刻,对CPU的执行权可能又被它抢到,也可能被其他线程抢到
setName():设置线程名字
join():调用此方法,所有的线程等待当前线程执行完才执行
当i==20时,强制让子线程进来,直到子线程完全执行完,才会执行主线程
isAlive();判断线程是否还存活
sleep():显示的让当前线程睡眠
设置线程的优先级
getPriority():返回线程优先值
setPriority(int new Priority):设置线程优先级,1,5,10
设置线程的优先级并不是说设置的优先级越高,他就先执行,只能说是提高可它限制性的概率
实例:
实现三个窗口售票,票数要设置为静态的(因为是继承Thread,使用实现Runnable就不用),这样三个窗口才能共用100张,
使用继承Thread
使用实现Runnable
当涉及到共享的时候,使用实现Runnable接口会更好,java是单继承,所以实现Runnable可以避免单继承
上面用继承和实现的方式实现抢票都存在线程安全的情况(重票问题),需要进行处理,因为多个线程操作同一个数据,一个线程还没有执行完,另外一个线程就参与进来,没有加锁的话会出现线程安全问题
多线程的优点:
1,提高程序的响应,对图形化更有意义,可憎前用户体验,
2,提高计算机系统的CPU的利用率
3,改善程序结构,将长又复杂的进程分为多个线程,独立运行,立于理解和修改
Java种的线程可分为两类:守护线程和用户线程
1.它们几乎每个方面都是相同的,唯一的区别就是判断JVM何时离开
2.守护线程是用来服务用户线程的,通过在start()方法前调用thread.setDaemon(trur)可
以把一个用户变成一个守护线程
3.java垃圾回收就是一个典型的守护线程。
4.若jvm中都是守护线程,当前jvm将退出
线程的生命周期
死锁:
不同的线程分别占用对方的同步资源不放弃,都在等待对方放弃自己需要的资源,就形成了线程的死锁
解决方法:
1.专门的算法,原则
2.尽量减少同步资源的定义,同步资源越多,越容易发生死锁
线程的通信
wait(),notify(),notifyAll()
wait():令当前的线程挂起并放弃CPU执行权,同步资源,让别的线程可以访问并修改共享资源,而当前线程排队等候在此对资源的访问
notify():唤醒正在排队等候同步资源的线程中优先级最高者结束等待
notifyAll():唤醒正在排队等待资源的所有线程结束等待
java.lang.Object提供了这三个方法只有在synchronized方法或synchronized代码块中才能使用,否则会报java.lang.illegalMonitorStateException异常
实现两个线程交叉打印1-100;
生产者和消费者的的问题