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

    xiaoxiao2024-11-02  84

    (23)多线程(上)

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

    (24)多线程(下)

    一.多线程(下)

     单例设计模式 构造方法私有化,声明一个私有的引用,对外提供公共的访问方法 懒汉式:单列的延迟加载模式,在方法中判断引用指向是否为null,是就创建对象 饿汉式:在声明引用时,就已经创建了对象,访问方法中直接返回该引用Timer t = new Timer(); //第一个参数,是安排的任务;第二个参数,是执行的事件;第三个参数,是过多长时间再执行 t.schedule(new TimerTask的子类,new Date(年份-1990,月份-1,day,时,分,秒),间隔时间);在同步代码块中,用哪个对象锁,就用哪个对象的的wait方法因为锁对象可以是任意对象,Object是所有的类的基类,所以wait方法和notify需要定义在Object中sleep方法和wait方法的区别 a.  sleep方法必须传入参数,参数就是时间,时间到了自动醒来      wait方法可以传入参数也可以不传入参数,传入参数就是在参数的时间结束后等待,不传入参数就是直接等待 b.  sleep方法在同步函数或同步代码中,不释放锁      wait方法在同步函数或同步代码中,释放锁互斥锁   (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();线程组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放在组中线程池 ExecutorService pool = Executors.newFixedThreadPool(2);  //参数2意思是线程池中可以放两个线程 pool.submit(new MyRunnable());           //将线程传入线程池中 pool.submit(new MyRunnable());           //将线程传入线程池中 pool.shutdown();          //关闭线程池  
    最新回复(0)