网络用户提要求找人帮忙做的网站,mg线上注册,互联网网站备案表,手机网站开发模板进程#xff1a;每个进程都有独立的代码和数据空间(进程上下文)#xff0c;进程间的切换会有较大的开销#xff0c;一个进程包含1--n个线程。线程#xff1a;同一类线程共享代码和数据空间#xff0c;每个线程有独立的运行栈和程序计数器(PC)#xff0c;线程切换开销小。…进程每个进程都有独立的代码和数据空间(进程上下文)进程间的切换会有较大的开销一个进程包含1--n个线程。线程同一类线程共享代码和数据空间每个线程有独立的运行栈和程序计数器(PC)线程切换开销小。多进程是指操作系统能同时运行多个任务(程序)多线程是指在同一程序中有多个顺序流在执行。线程和进程一样分为五个阶段创建、就绪、运行、阻塞、终止。在java中要想实现多线程有两种手段一种是继续Thread类另外一种是实现Runable接口。1扩展java.lang.Thread类程序启动运行main时候java虚拟机启动一个进程主线程main在main()调用时候被创建。随着调用其他对象的start方法另外的线程也启动了这样整个应用就在多线程下运行。注意start()方法的调用后并不是立即执行多线程代码而是使得该线程变为可运行态(Runnable)什么时候运行是由操作系统决定的。从程序运行的结果可以发现多线程程序是乱序执行。因此只有乱序执行的代码才有必要设计为多线程。Thread.sleep()方法调用目的是不让当前线程独自霸占该进程所获取的CPU资源以留出一定时间给其他线程执行的机会。实际上所有的多线程代码执行顺序都是不确定的每次执行的结果都是随机的。但是start方法重复调用的话会出现java.lang.IllegalThreadStateException异常。2实现java.lang.Runnable接口通过实现Runnable接口使得类有了多线程类的特征。run()方法是多线程程序的一个约定。所有的多线程代码都在run方法里面。Thread类实际上也是实现了Runnable接口的类。在启动的多线程的时候需要先通过Thread类的构造方法Thread(Runnable target) 构造出对象然后调用Thread对象的start()方法来运行多线程代码。实际上所有的多线程代码都是通过运行Thread的start()方法来运行的。因此不管是扩展Thread类还是实现Runnable接口来实现多线程最终还是通过Thread的对象的API来控制线程的熟悉Thread类的API是进行多线程编程的基础。3Thread和Runnable的区别实现Runnable接口比继承Thread类所具有的优势1)适合多个相同的程序代码的线程去处理同一个资源2)可以避免java中的单继承的限制3)增加程序的健壮性代码可以被多个线程共享代码和数据独立。4线程状态转换1、新建状态(New)新创建了一个线程对象。2、就绪状态(Runnable)线程对象创建后其他线程调用了该对象的start()方法。该状态的线程位于可运行线程池中变得可运行等待获取CPU的使用权。3、运行状态(Running)就绪状态的线程获取了CPU执行程序代码。4、阻塞状态(Blocked)阻塞状态是线程因为某种原因放弃CPU使用权暂时停止运行。直到线程进入就绪状态才有机会转到运行状态。阻塞的情况分三种1》等待阻塞运行的线程执行wait()方法JVM会把该线程放入等待池中。2》同步阻塞运行的线程在获取对象的同步锁时若该同步锁被别的线程占用则JVM会把该线程放入锁池中。3》其他阻塞运行的线程执行sleep()或join()方法或者发出了I/O请求时JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时线程重新转入就绪状态。5、死亡状态(Dead)线程执行完了或者因异常退出了run()方法该线程结束生命周期。5线程调度1、调整线程优先级Java线程有优先级优先级高的线程会获得较多的运行机会。Java线程的优先级用整数表示取值范围是1~10Thread类有以下三个静态常量static int MAX_PRIORITY线程可以具有的最高优先级取值为10。static int MIN_PRIORITY线程可以具有的最低优先级取值为1。static int NORM_PRIORITY分配给线程的默认优先级取值为5。Thread类的setPriority()和getPriority()方法分别用来设置和获取线程的优先级。每个线程都有默认的优先级。主线程的默认优先级为Thread.NORM_PRIORITY。线程的优先级有继承关系比如A线程中创建了B线程那么B将和A具有相同的优先级。JVM提供了10个线程优先级但与常见的操作系统都不能很好的映射。如果希望程序能移植到各个操作系统中应该仅仅使用Thread类有以下三个静态常量作为优先级这样能保证同样的优先级采用了同样的调度方式。2、线程睡眠Thread.sleep(long millis)方法使线程转到阻塞状态。millis参数设定睡眠的时间以毫秒为单位。当睡眠结束后就转为就绪(Runnable)状态。sleep()平台移植性好。3、线程等待Object类中的wait()方法导致当前的线程等待直到其他线程调用此对象的 notify() 方法或 notifyAll() 唤醒方法。这个两个唤醒方法也是Object类中的方法行为等价于调用 wait(0) 一样。4、线程让步Thread.yield() 方法暂停当前正在执行的线程对象把执行机会让给相同或者更高优先级的线程。5、线程加入join()方法等待其他线程终止。在当前线程中调用另一个线程的join()方法则当前线程转入阻塞状态直到另一个进程运行结束当前线程再由阻塞转为就绪状态。6、线程唤醒Object类中的notify()方法唤醒在此对象监视器上等待的单个线程。如果所有线程都在此对象上等待则会选择唤醒其中一个线程。选择是任意性的并在对实现做出决定时发生。线程通过调用其中一个 wait 方法在对象的监视器上等待。 直到当前的线程放弃此对象上的锁定才能继续执行被唤醒的线程。被唤醒的线程将以常规方式与在该对象上主动同步的其他所有线程进行竞争例如唤醒的线程在作为锁定此对象的下一个线程方面没有可靠的特权或劣势。类似的方法还有一个notifyAll()唤醒在此对象监视器上等待的所有线程。6线程同步1、synchronized关键字的作用域有二种一种是某个对象实例内synchronized aMethod(){}可以防止多个线程同时访问这个对象的synchronized方法(如果一个对象有多个synchronized方法只要一个线程访问了其中的一个synchronized方法其它线程不能同时访问这个对象中任何一个synchronized方法)。这时不同的对象实例的synchronized方法是不相干扰的。也就是说其它线程照样可以同时访问相同类的另一个对象实例中的synchronized方法第二种是某个类的范围synchronized static aStaticMethod{}防止多个线程同时访问这个类中的synchronized static 方法。它可以对类的所有对象实例起作用。2、除了方法前用synchronized关键字synchronized关键字还可以用于方法中的某个区块中表示只对这个区块的资源实行互斥访问。用法是: synchronized(this){/*区块*/}它的作用域是当前对象3、synchronized关键字是不能继承的也就是说基类的方法synchronized f(){} 在继承类中并不自动是synchronized f(){}而是变成了f(){}。继承类需要你显式的指定它的某个方法为synchronized方法。