您的位置:首页 > 编程语言 > Java开发

Day16 JavaSE基础复习 (23)多线程(上) (24)多线程(下)

2019-05-26 21:08 393 查看

(23)多线程(上)

  1. 并行就是两个任务同时运行,就是甲任务进行的同时,乙任务也在进行。需要多核CPU
    并发是指两个任务都请求运行,而处理器只能接收一个任务,就把这两个任务轮流进行,时间间隔很短
  2. 多线程实现方式:
    2.1.定义一个类继承Thread,重写run方法,将要执行的代码写在run方法中。创建该类的对象,引用.start(); 开启线程
    2.2.定义一个类实现Runnable,重写run方法,创建该类的对象,new Thread(引用).start();  开启线程
  3. 匿名内部类实现线程的两种方式
    3.1 new Thread(){ 重写run方法 }.start();
    3.2 new Thread(  new Runnable() {重写run方法}  ).start();
  4. Thread.currentThread();   //获取当前的线程 为了协助3.2中Runnable的,因为Runnable的子类不能直接调用Thread方法
  5. Thread.sleep(1000);  //停止1秒 ,1000毫秒   会抛出中断异常
  6. Thread.setDaemon(true);      //当传入true , 就意味着设置为守护线程  ,,其他线程结束后,守护线程也随之结束
  7. Thread.yield();     //礼让线程
  8. Thread.setPriority(5);   //设置优先级   范围1-10  10最高,1最小,5默认
  9. synchronized关键字 
    synchronized(对象){ };    //同步代码块,锁机制,锁对象是任意的。不能用匿名对象,因为匿名对象不是同一个对象
    同步方法,只需要在方法上加synchronized关键字即可
    非静态的同步方法锁对象是this
    静态的同步方法的锁对象是该类的字节码对象,类名.class
    如果用引用数据类型成员变量当作锁对象,必须是静态的
  10. Vector是线程安全的            ArrayList是线程不安全的
    StringBuffer是线程安全的   StringBuilder是线程不安全的
    Hashtable是线程安全的      HashMap是线程不安全的
    Collections.synchronizedList(List<T> list );    //可以将线程不安全的集合转换成线程安全的

(24)多线程(下)

一.多线程(下)

  1.  单例设计模式
    构造方法私有化,声明一个私有的引用,对外提供公共的访问方法
    懒汉式:单列的延迟加载模式,在方法中判断引用指向是否为null,是就创建对象
    饿汉式:在声明引用时,就已经创建了对象,访问方法中直接返回该引用
  2. Timer t = new Timer();
    //第一个参数,是安排的任务;第二个参数,是执行的事件;第三个参数,是过多长时间再执行
    t.schedule(new TimerTask的子类,new Date(年份-1990,月份-1,day,时,分,秒),间隔时间);
  3. 在同步代码块中,用哪个对象锁,就用哪个对象的的wait方法
  4. 因为锁对象可以是任意对象,Object是所有的类的基类,所以wait方法和notify需要定义在Object中
  5. sleep方法和wait方法的区别
    a.  sleep方法必须传入参数,参数就是时间,时间到了自动醒来
         wait方法可以传入参数也可以不传入参数,传入参数就是在参数的时间结束后等待,不传入参数就是直接等待
    b.  sleep方法在同步函数或同步代码中,不释放锁
         wait方法在同步函数或同步代码中,释放锁
  6. 互斥锁   (JDK1.5的特性)
    ReentrantLock r = new ReentrantLock();
    Condition c1 = r.newCondition();
    Condition c2 = r.newCondition();
    Condition c3 = r.newCondition();
    在同步代码块前后加上 r.lock();  和   r.unlock();
    r.lock(); 根据判断条件 c1.await();   不符合条件就执行,然后最后唤醒c2    c2.signal();     r.unlock();
    r.lock(); 根据判断条件 c2.await();   不符合条件就执行,然后最后唤醒c3    c3.signal();     r.unlock();
    r.lock(); 根据判断条件 c3.await();   不符合条件就执行,然后最后唤醒c1    c1.signal();     r.unlock();
  7. 线程组ThreadGroup
    ThreadGroup tg = new ThreadGroup("name"); //创建新的线程组
    MyRunnable mr = new MyRunnable();              //创建Runnable的子类,重写了run方法
    Thread t1 = new Thread(tg,mr,"name1");          //将线程t1放在组中
    Thread t2 = new Thread(tg,mr,"name2");          //将线程t2放在组中
  8. 线程池
    ExecutorService pool = Executors.newFixedThreadPool(2);  //参数2意思是线程池中可以放两个线程
    pool.submit(new MyRunnable());           //将线程传入线程池中
    pool.submit(new MyRunnable());           //将线程传入线程池中
    pool.shutdown();          //关闭线程池  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: