zoukankan      html  css  js  c++  java
  • 多线程

    1.概念杂记

    * runnable不叫线程,叫任务
    * 继承和接口,一般优先选择接口
    * 线程睡眠时会释放cpu
    * 后台线程(守护线程)会因前台线程的结束而结束
    * 线程优先级1-10,默认5
    * 多线程同步机制必须使用同一把锁(即同一个对象)
    * 同步方法使用的锁就是调用的对象this
    * 多线程用StringBuffer,单线程用StringBuilder
    * synchronized既能同步代码块,也能同步方法
    * yield()是让出cpu,但是还可以再抢
    * static synchronized的锁为类名.class(字节码文件)
    * 单例模式安全性和效率解决方法:多重判断
    * wait()等待,notify()唤醒
    * wait()会释放锁,sleep不会释放锁
    * wait()必须放在同步中
    * 因为同步锁可以为任意锁或对象,所以wait方法在Object类下
    * 同步嵌套同步,发生死锁的概率很大
    * 哪个线程执行wait(),哪个线程就等待

    2.线程两种启动方法

    * 继承Thread类

    class MyThread extends Thread{
        @Override
        public void run() {
            XXX;
        }
    }
    
    public class ThreadDemo1 {
        public static void main(String[] args) {
            MyThread t1 = new MyThread();
            t1.start();
        }
    }

    * 实现Runnable接口

    public class MyRunnable implements Runnable {
        @Override
        public void run() {
            XXX;
        }
    }
    
    public class ThreadDemo2 {
        public static void main(String[] args) {
            MyRunnable runnable = new MyRunnable();
            Thread t1 = new Thread(runnable);
            t1.start();
        }
    }

    3.多线程

    * 继承Thread类

    MyThread t1 = new MyThread();
    MyThread t2 = new MyThread();
    t1.start();
    t2.start();

    * 实现Runnable接口

    MyRunnable runnable = new MyRunnable();
    Thread t1 = new Thread(runnable);
    Thread t2 = new Thread(runnable);
    t1.start();
    t2.start();

    4.线程安全较高效率的单例模式

    public class SingleInstance {
        private static SingleInstance single;
        private SingleInstance(){}//构造方法私有化为了不让别人new
        public static SingleInstance getInstance(){
            if(single == null){
                synchronized (SingleInstance.class) {
                    if(single == null){
                        single = new SingleInstance();
                    }
                }
            }
            return single;
        }
    }

    5.wait方法和sleep方法的区别

     *  1:wait方法会释放锁,sleep方法不会释放锁。
     *  2:wait必须放在同步中,sleep不一定放在同步中.
     *  3:wait一般的情况是让对方唤醒。sleep通常会自己醒过来。
     *  4:wait需要用锁去调用。sleep是用Thread类或者Thread对象来调用。

    6.Condition

    public static Lock lock = new ReentrantLock();
    //创建一个Condition
    public static Condition p_con = lock.newCondition();
    public static Condition c_con = lock.newCondition();

    例子:

    class BoundedBuffer {
        final Lock lock = new ReentrantLock();
        final Condition notFull = lock.newCondition();
        final Condition notEmpty = lock.newCondition();
    
        final Object[] items = new Object[100];
        int putptr, takeptr, count;
    
        public void put(Object x) throws InterruptedException {
            lock.lock();
            try {
                while (count == items.length)
                    notFull.await();
                items[putptr] = x;
                if (++putptr == items.length)
                    putptr = 0;
                ++count;
                notEmpty.signal();
            } finally {
                lock.unlock();
            }
        }
    
        public Object take() throws InterruptedException {
            lock.lock();
            try {
                while (count == 0)
                    notEmpty.await();
                Object x = items[takeptr];
                if (++takeptr == items.length)
                    takeptr = 0;
                --count;
                notFull.signal();
                return x;
            } finally {
                lock.unlock();
            }
        }
    }

    7.Executors-线程池

    ExecutorService service = Executors.newFixedThreadPool(2);
    for(int i = 0;i<100;i++){
        service.execute(new Runnable(){
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName()+":"+i);
            }
        });
    }

    8.线程的生命周期

  • 相关阅读:
    zkRollup原理(转载)
    2012元旦遭遇坑爹的12306订票网站付了款不出票
    VM.xPort.ExcelClient XXX备忘
    Parsing html markup text using MSHTML
    Asp.net中模仿Winform的MessageBox
    ReportViewer 2008 打印出现Error loading resource library. (0x8007007E)和(0x80070006)
    使用ADO.net将数据导出到Excel并提供下载
    【备忘】Oracle常用系统表(做代码生成器用得到)
    Worm.Sober.b(“清醒”病毒)
    发布基于T4模板引擎的代码生成器[Kalman Studio]
  • 原文地址:https://www.cnblogs.com/anni-qianqian/p/5223791.html
Copyright © 2011-2022 走看看