进程就是正在运行的程序,它是系统资源调度的独立单位,并且一个进程可以执行多个任务,而线程就是程序执行的任务,它是程序使用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类更加能描述数据共享的概念
购买火车票,共有100张票,而它有3个售票窗口售票,请设计一个程序模拟该火车售票系统,通过实现Runnable接口实现(模拟网络延迟)。
为了解决线程安全问题,只让一个线程进入,并阻止另一个线程进入,那么就使用到了synchronize(同步代码块)或者继承Lock(锁)。
Java内存模型规定了所有的变量都存储在主内存中,每条线程中还有自己的工作内存,工作内存中保存了被该线程所使用到的变量(这些变量是从主内存中拷贝而来),线程对变量的所有操作(读取,赋值)都必须在工作内存中进行,不同线程之间也无法直接访问对方工作内存中的变量,它们间变量值的传递均需要通过主内存来完成。对于解决该问题,Java提供了volatile关键字来,该关键字保证了内存可见性。
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(); } } 复制代码
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 复制代码