JUC线程和进程
程序员文章站
2022-06-28 20:26:07
JUC一.线程和进程进程:一个进程包含多个线程,至少包含一个线程!java默认有俩个线程,一个main主方法,还有一个GC垃圾回收。线程:一个进程就像一只火车,一个线程就像一只车厢,比如说一只车厢着火了,会影响其他车厢,但是不会影响另一辆火车(进程之间没有影响),同一个进程下之间数据容易完成数据共享,比如同一辆火车不同车厢之间。并发:cpu只有一核,快速切换,实现多线程,交替执行。并行cpu多核,不用快速切换,多个任务同时执行,一起行走。......
JUC
一.线程和进程
进程:
一个进程包含多个线程,至少包含一个线程!
java默认有俩个线程,一个main主方法,还有一个GC垃圾回收。
线程:
一个进程就像一只火车,一个线程就像一只车厢,比如说一只车厢着火了,会影响其他车厢,但是不会影响另一辆火车(进程之间没有影响),同一个进程下之间数据容易完成数据共享,比如同一辆火车不同车厢之间。
并发:
cpu只有一核,快速切换,实现多线程,交替执行。
并发编程的本质:充分利用cpu资源
并行
cpu多核,不用快速切换,多个任务同时执行,一起行走。
线程有几个状态:
public enum State {
//新建
NEW,
//运行
RUNNABLE,
//阻塞
BLOCKED,
//等待(一直死等)
WAITING,
//超时等待(有等待时间,过期不候)
TIMED_WAITING,
//终止
TERMINATED;
}
wait和sleep的区别:
1.来自不同的类:
wait->object
sleep->Thread
2.锁的释放:
wait可以释放锁!
sleep抱着锁头睡觉,不会释放!
3.适用范围:
wait必须在同步代码块中!
sleep可以在任何地方!
lock锁:
synchronized 模拟抢票!
public class Test {
public static void main(String[] args) {
Ticket ticket = new Ticket();
new Thread(
new Runnable(){
@Override
public void run() {
for (int i=0;i<50;i++){
ticket.sale();
}
}
}
).start();
new Thread(
new Runnable(){
@Override
public void run() {
for (int i=0;i<50;i++){
ticket.sale();
}
}
}
).start();
new Thread(
new Runnable(){
@Override
public void run() {
for (int i=0;i<50;i++){
ticket.sale();
}
}
}
).start();
}
}
class Ticket{
private int number = 40;
public synchronized void sale() {
if (number > 0) {
System.out.println("还剩" + (--number) + "张票!");
}
}
}
Lock锁:
ReentrantLock:可重入锁
三个步骤:
1.Lock lock = new ReentrantLock();
2.方法前加锁lock.lock();
3.try cache finally{
lock.unlock()#解锁
}
public class Test2 {
public static void main(String[] args) {
Ticket ticket = new Ticket();
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 40; i++) {
ticket.sale();
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 40; i++) {
ticket.sale();
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 40; i++) {
ticket.sale();
}
}
}).start();
}
}
class Ticket2{
int number =40;
//可重用锁
Lock lock = new ReentrantLock();
public void sale(){
lock.lock();
try {
if (number>0) {
System.out.println("还剩" + (--number) + "张票");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}
本文地址:https://blog.csdn.net/qq_44805043/article/details/112659216