进程:正在进行中的程序。其实进程就是一个应用程序运行时的内存分配空间。
线程:其实就是进程中一个程序执行控制单元,一条执行路径。进程负责的是应用程序的空间的标示。线程负责的是应用程序的执行顺序。
一个进程至少有一个线程在运行,当一个进程中出现多个线程时,就称这个应用程序是多线程应用程序,每个线程在栈区中都有自己的执行空间,自己的方法区、自己的变量。
jvm在启动的时,首先有一个主线程,负责程序的执行,调用的是main函数。主线程执行的代码都在main方法中。
当产生垃圾时,收垃圾的动作,是不需要主线程来完成,因为这样,会出现主线程中的代码执行会停止,会去运行垃圾回收器代码,效率较低,所以由单独一个线程来负责垃圾回收。
随机性的原理:因为cpu的快速切换造成,哪个线程获取到了cpu的执行权,哪个线程就执行。
线程状态:
被创建:start()
运行:具备执行资格,同时具备执行权;
冻结:sleep(time),wait()—notify()唤醒;线程释放了执行权,同时释放执行资格;
临时阻塞状态:线程具备cpu的执行资格,没有cpu的执行权;
消亡:stop()
同步代码块。
格式:
synchronized(对象) { // 任意对象都可以。这个对象就是锁。
需要被同步的代码;
}- package pack;
- // 同步死锁:通常只要将同步进行嵌套,就可以看到现象。
- // 同步函数中有同步代码块,同步代码块中还有同步函数。
- class MyLock{
- static Object locka=new Object();
- static Object lockb=new Object();
- }
- class Test implements Runnable{
- private boolean flag;
- Test(boolean flag){
- this.flag=flag;
- }
- public void run(){
- if(flag){
- synchronized(MyLock.locka){
- System.out.println("ifif-locka");
- synchronized(MyLock.lockb){
- System.out.println("ifif-lockb");
- }
- }
- }
- else{
- synchronized(MyLock.lockb){
- System.out.println("else-lockb");
- synchronized(MyLock.locka){
- System.out.println("else-locka");
- }
- }
- }
- }
- }
- class DeadLockTest{
- public static void main(String[] args){
- Thread t1=new Thread(new Test(true));
- Thread t2=new Thread(new Test(false));
- t1.start();t2.start();
- }
- }[code]package pack;
- // 同步:解决线程安全问题。
- // 弊端:相对降低性能,因为判断锁需要消耗资源,产生了死锁。
- // 定义同步是有前提的:
- // 1,必须要有两个或者两个以上的线程,才需要同步。
- // 2,多个线程必须保证使用的是同一个锁。
- // 同步函数:其实就是将同步关键字定义在函数上,让函数具备了同步性。
- // 同步函数所使用的锁都是this,因为函数都有自己所属的对象。
- // 同步代码块使用的锁可以是任意对象。
- // 同步函数使用的锁是this,静态同步函数的锁是该类的字节码文件对象。
- class Ticket implements Runnable{
- private int tick=100;
- private Object obj=new Object();
- boolean flag=true;
- public void run(){
- if(flag){
- while(true){
- synchronized(obj){
- if(tick>0)
- System.out.println(Thread.currentThread().getName()+"code:"+tick--);
- }
- }
- }else
- while(true)
- this.show();
- }
- public synchronized void show(){
- if(tick>0){
- System.out.println(Thread.currentThread().getName()+"show:"+tick--);
- }
- }
- }
- class TicketDemo2{
- public static void main(String[] args){
- Ticket t=new Ticket();
- Thread t1=new Thread(t);
- Thread t2=new Thread(t);
- t1.start();
- t.flag=false;
- t2.start();
- }
- }
复制代码 [/code] |