多线程基础

来源:互联网 发布:网络乞丐mc吴迪伴奏 编辑:程序博客网 时间:2024/06/03 14:57

2017-07-27

  1. 多线程一般两个方式,继承Thread类或者实现Runnable接口,最终都是要调用Thread的start()方法
  2. main方法开启主线程,后台还有jvm用于回收垃圾的后台线程。
  3. 线程有好几个状态,Runnable,Running,Block。每个Runnable线程都有资格争抢CPU执行权。
  4. Runnable表示有执行的资格等待被调度,当获取CPU执行权后,即可编程Running
  5. Block即为阻塞状态,此时该线程是没有执行资格的,一般是调用了join(),sleep(),wait(),或者被同步锁挡住(synchronized)。
  6. 当操作共享数据的时候,多线程就会造成错误,比如多窗口卖票,可能出现负数。此时需要同步代码块或者同步函数来解决。
  7. 静态同步函数的锁是class文件,因为静态方法执行的时候还没创建对象。
        import java.lang.Thread;        import java.lang.Runnable;        class ThreadDemo3 implements Runnable{            private int ticket = 100;    //共享数据 100张票            private boolean flag;       // 定义标记,让同步代码块和同步函数都可以被执行,两者的对象锁都是this            public void run () {                if (flag) {                    while(true) {                        synchronized (this) {        //同步代码块                            if (ticket > 0 ) {                                System.out.println(Thread.currentThread().getName() + "......" + ticket--);                            }                        }                    }                   }  else {                        while (true) {                            show();                         }                                           }            }            public synchronized void show() {         //同步函数                if (ticket > 0 ) {                  //try{Thread.sleep(10); } catch (Exception e) {}                  System.out.println(Thread.currentThread().getName() + "......" + ticket--);                }            }            public static void main(String[] args) {                ThreadDemo3 td = new ThreadDemo3();                Thread t1 = new Thread(td);                Thread t2 = new Thread(td);                t1.start();                td.flag = false;                t2.start();            }        }