欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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锁:
JUC线程和进程
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