java多线程

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;

生产者和消费者的的问题

生命不止,折腾不息
原文地址:https://www.cnblogs.com/steakliu/p/10555980.html