转载

Java进程和线程

进程就是正在运行的程序,它是系统资源调度的独立单位,并且一个进程可以执行多个任务,而线程就是程序执行的任务,它是程序使用CPU的基本单位,因此也可以说线程是依赖于进程的。

进程

进程就是正在运行的程序,它是系统资源调度的独立单位,也是操作系统运行的基本单元,各个进程之间不会相互影响,因为系统给它们分配了不同的空间和资源。他又分为单进程和多进程。

单进程的计算机一次只能做一件事情,而多进程的计算机可以做到一次做不同的事情,比如一边听音乐,一边听打游戏,这两件事情虽然感觉起来是在同时一起进行的,但其实是CPU在做着程序间的高效切换,这才让我们觉得是同时进行的。

线程

线程就是程序(进程)执行的任务,它分为单线程和多线程。

单线程也就是做的事情专一,不会分神去做别的事,也就是程序只有一条执行路径;多线程就是可以分出多条路去做同一件事情,也就是程序有多条执行路径,比如三个伙伴迷路了,大家分别去问路人路线,最后大家在目的地集合,因此多线程的存在,不是提高程序的执行速度,其实是为了提高应用程序的使用率,也可以说程序的执行其实都是在抢CPU的资源,也就是抢CPU的执行权,而其中的某一个进程如果执行路径比较多,就会有更高的几率抢到CPU的执行权,但这一过程是随机的,不知道哪一个线程会在哪一个时刻占到这个资源,所以线程的执行有随机性。

一个程序至少一个进程,一个进程至少一个线程。

优缺点

线程执行开销小,但是不利于资源的管理和保护。线程适合在SMP机器(双CPU系统)上运行。

进程执行开销大,但是能够很好的进行资源管理和保护。进程可以跨机器前移。

多线程有几种实现方法?有什么区别?

实现多线程有两种方式:(自JDK1.5之后有三种,最后一种并不常用)

1.继承Thread类

2.实现Runnable接口(Callable接口)

一个类如果实现了Runnable接口或者继承了Thread类,那么它就是一个多线程类,如果是要实现多线程,还需要重写run()方法,所以run() 方法是多线程的入口。

多线程的两种实现方式的区别:

1.Thread是Runnable接口的子类,实现Runnable接口的方式解决了Java单继承的局限

2.Runnable接口实现多线程比继承Thread类更加能描述数据共享的概念

Java进程和线程

代码演示

购买火车票,共有100张票,而它有3个售票窗口售票,请设计一个程序模拟该火车售票系统,通过实现Runnable接口实现(模拟网络延迟)。

为了解决线程安全问题,只让一个线程进入,并阻止另一个线程进入,那么就使用到了synchronize(同步代码块)或者继承Lock(锁)。

Java内存模型规定了所有的变量都存储在主内存中,每条线程中还有自己的工作内存,工作内存中保存了被该线程所使用到的变量(这些变量是从主内存中拷贝而来),线程对变量的所有操作(读取,赋值)都必须在工作内存中进行,不同线程之间也无法直接访问对方工作内存中的变量,它们间变量值的传递均需要通过主内存来完成。对于解决该问题,Java提供了volatile关键字来,该关键字保证了内存可见性。

Java进程和线程

synchronize关键字代码块

public class Ticket implements Runnable{
    //设置票数
    int ticket = 100;   
    Object obj = new Object();
    
    @Override
    public void run() {
        while (true){
            synchronized (obj) {
                if (ticket > 0) {
                    try {
                        Thread.sleep(1000);//模拟网络延迟
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    
                    System.out.println(Thread.currentThread().getName() + "正在出售" + (ticket--) + "张票"+"====="+Thread.currentThread().getPriority());
                }else {
                    //当票不满足条件是退出循环
                    break;
                }
            
            }

        }
        	
    }
    
    public static void main(String[] args) {
        Ticket ticket = new Ticket();
        
        Thread thread1 = new Thread(ticket);
        thread1.setName("窗口1");
        
        Thread thread2 = new Thread(ticket);
        thread2.setName("窗口2");
        
        Thread thread3 = new Thread(ticket);
        thread3.setName("窗口3");
        
        //开启线程
        thread1.start();
        thread2.start();
        thread3.start();
        
    }
    
}
复制代码

继承Lock(锁)

public class Ticket implements Runnable{
    //设置票数
    int ticket = 100;
    Lock lock = new ReentrantLock();
    
    @Override
    public void run() {
        while (true){
                lock.lock();
                if (ticket > 0) {
                    try {
                        Thread.sleep(50);//模拟网络延迟
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    
                    System.out.println(Thread.currentThread().getName() + "正在出售" + (ticket--) + "张票"+"====="+Thread.currentThread().getPriority());
                    lock.unlock();
                }else {
                    
                    //当票不满足条件是退出循环
                    break;
                }

        }
        	
    }

    public static void main(String[] args) {
        Ticket2 ticket = new Ticket2();
        
        Thread thread1 = new Thread(ticket);
        thread1.setName("窗口1");
        thread1.setPriority(4);
        
        Thread thread2 = new Thread(ticket);
        thread2.setName("窗口2");
        thread2.setPriority(5);
        
        Thread thread3 = new Thread(ticket);
        thread3.setName("窗口3");
        thread2.setPriority(7);
        
        //开启线程
        thread1.start();
        thread2.start();
        thread3.start();
        
    }
    
}

复制代码

执行结果

窗口1正在出售100张票=====5
窗口1正在出售99张票=====5
窗口1正在出售98张票=====5
窗口1正在出售97张票=====5
窗口1正在出售96张票=====5
窗口1正在出售95张票=====5
窗口1正在出售94张票=====5
窗口3正在出售93张票=====5
窗口2正在出售92张票=====5
窗口2正在出售91张票=====5
窗口3正在出售90张票=====5
窗口1正在出售89张票=====5
窗口1正在出售88张票=====5
窗口3正在出售87张票=====5
窗口3正在出售86张票=====5
窗口3正在出售85张票=====5
窗口3正在出售84张票=====5
窗口2正在出售83张票=====5
窗口3正在出售82张票=====5
窗口1正在出售81张票=====5
窗口1正在出售80张票=====5
窗口1正在出售79张票=====5
窗口1正在出售78张票=====5
窗口1正在出售77张票=====5
窗口3正在出售76张票=====5
窗口2正在出售75张票=====5
窗口3正在出售74张票=====5
窗口1正在出售73张票=====5
窗口3正在出售72张票=====5
窗口2正在出售71张票=====5
窗口3正在出售70张票=====5
窗口1正在出售69张票=====5
窗口3正在出售68张票=====5
窗口2正在出售67张票=====5
窗口2正在出售66张票=====5
窗口3正在出售65张票=====5
窗口1正在出售64张票=====5
窗口3正在出售63张票=====5
窗口2正在出售62张票=====5
窗口2正在出售61张票=====5
窗口2正在出售60张票=====5
窗口3正在出售59张票=====5
窗口3正在出售58张票=====5
窗口1正在出售57张票=====5
窗口1正在出售56张票=====5
窗口1正在出售55张票=====5
窗口1正在出售54张票=====5
窗口1正在出售53张票=====5
窗口3正在出售52张票=====5
窗口3正在出售51张票=====5
窗口3正在出售50张票=====5
窗口3正在出售49张票=====5
窗口3正在出售48张票=====5
窗口3正在出售47张票=====5
窗口3正在出售46张票=====5
窗口2正在出售45张票=====5
窗口3正在出售44张票=====5
窗口1正在出售43张票=====5
窗口1正在出售42张票=====5
窗口1正在出售41张票=====5
窗口1正在出售40张票=====5
窗口1正在出售39张票=====5
窗口1正在出售38张票=====5
窗口1正在出售37张票=====5
窗口1正在出售36张票=====5
窗口1正在出售35张票=====5
窗口1正在出售34张票=====5
窗口1正在出售33张票=====5
窗口1正在出售32张票=====5
窗口1正在出售31张票=====5
窗口1正在出售30张票=====5
窗口1正在出售29张票=====5
窗口1正在出售28张票=====5
窗口1正在出售27张票=====5
窗口1正在出售26张票=====5
窗口1正在出售25张票=====5
窗口1正在出售24张票=====5
窗口1正在出售23张票=====5
窗口3正在出售22张票=====5
窗口3正在出售21张票=====5
窗口3正在出售20张票=====5
窗口2正在出售19张票=====5
窗口2正在出售18张票=====5
窗口3正在出售17张票=====5
窗口3正在出售16张票=====5
窗口3正在出售15张票=====5
窗口1正在出售14张票=====5
窗口1正在出售13张票=====5
窗口1正在出售12张票=====5
窗口1正在出售11张票=====5
窗口1正在出售10张票=====5
窗口1正在出售9张票=====5
窗口1正在出售8张票=====5
窗口1正在出售7张票=====5
窗口3正在出售6张票=====5
窗口3正在出售5张票=====5
窗口3正在出售4张票=====5
窗口3正在出售3张票=====5
窗口3正在出售2张票=====5
窗口3正在出售1张票=====5

复制代码
原文  https://juejin.im/post/5dc1153c6fb9a04a71279e29
正文到此结束
Loading...