【基础知识】JAVA多线程学习笔记

一、概念相关

1、多线程

    (1)多线程:一个应用程序有多条执行路径

            进程:正在执行的应用程序

            线程:线程依赖于进程存在,一个进程至少有一个线程,

            单线程:一个应用只有一条执行路径,

            多线程:一个应用程序有多条执行路径

            多进程的意义是什么?

                        提高cpu的使用率,减少CPU的空闲时间

    (2)java程序的运行原理以及JVM的驱动是多线程的吗?

            A:java命令去启动JVM,JVM会启动一个进程,该进程会启动一个主线程

            B:JVM的启动是多线程的,因为他最低有两个现成启动了,主线程和垃圾回收线程

   (3)多线程的实现方案

           A:继承Thread类案例:

                定义线程类

                 public class ThreadDemo extends Thread {

                     public ThreadDemo(){}
                     public ThreadDemo(String name){
                         super(name);
                     }
                     public void run() {
                         //在这里写自己的业务代码
                         for (int i = 0; i <100; i++) {
                             System.out.println(Thread.currentThread().getName()+":"+i);
                         }
                     }
                 } 

            定义运行类 :

                public class MyThread {

                    public static void main(String[] args) {
                        ThreadDemo td1 = new ThreadDemo("td1");
                        ThreadDemo td2 = new ThreadDemo("td2");
                        td1.start();//运行线程
                        //td1.setName("td1");//给线程命名
                        td2.start();
                        //td2.setName("td2");
                    }

                }

           B:实现Runnable接口

                 步骤:1.自定义MyRunnable类实现Runable接口

                            2.重写run方法

                            3.创建MyRunnable类的对象

                            4、创建Thread类的对象,并把3的对象传递进来

                  //定义业务类
                 public class ThreadDemo implements Runnable {
                     public void run() {
                         //在这里写自己的业务代码
                         for (int i = 0; i <100; i++) {
                             System.out.println(Thread.currentThread().getName()+":"+i);
                         }
                     }
                 }

                   // 运行方式
                  ThreadDemo td1 = new ThreadDemo();
                          Thread td = new Thread(td1);
                          td.setName("xianchegn ");
                          td.start();
    }

 

   (4)线程的调度和优先级问题

           A:线程的调度

               a:分时调度

               b:抢占式调度(java采用的是该调度方式)

           B:获取和设置线程优先级

               a:默认是5

               b:控制范围是1-10

           td1.setPriority(1);//设置线程优先级方式

         总结:优先权高仅仅表示线程获取CPU时间片的几率高,不是就是说权限高就能一定提前执行,而只是提前执行几率高了  

   (5)线程的控制(常见方法)

           A:休眠线程:暂停当前线程执行     

                      Thread.sleep(整形毫秒数);//1000ms= 1s

           B:加入线程:等待join的线程终止(你们都别跑了,等我终止之后再跑)

                     td1.jion();

           C:礼让线程:一定程度上保证线程轮流执行

                     td1.yield();

           D:后台线程:将该线程设置为守护线程或用户线程,当正在运行的线程都是守护线程时,java虚拟机退出,必须在启动                                     前设定

                     td1.setDeamon(boolean on);  //将td1设置为守护线程(守护xx线程)                

           E:终止线程

                    td1.stop();//过时方法,一般不用

                    td1.interrupt();//终止线程,并抛出异常

   (6)线程的生命周期

           A:新建

           B:就绪,有执行资格,没有执行权

           C:运行,有执行资格,有执行权

           D:阻塞,没有执行权、执行资格,需要激活

           E:死亡,等待垃圾回收

   (7)电影院买票程序的实现

           A:继承Thread类

           B:实现Runnable

    (8)解决卖票程序出现的问题

           A:为了更符合真实的场景,加入了休眠100毫秒

           B:获取和设置线程优先级

               a:同票多次贩卖

               b:超卖(负票数)

    (9)多线程安全问题的原因(判断程序是否有线程安全问题依据)

           A:是否有多线程环境

           B:是否有共享数据

           C:是否有多条语句操作共享数据

    (1·0)同步解决线程安全问题

            A:同步代码块

               synchronizde(锁对象){

                     需要被同步的代码;

               }(这里的锁对象可以是任意对象)

           B:同步方法

                     把同步加在方法上。

                     锁对象是this

                       public synchronizde 方法名(锁对象){

                               需要被同步的代码;

                                 }

           C:静态同步方法

                     把同步加在方法上

                     锁对象是当前类的字节码文件对象

            D:Lock工具类

                   private Lock  lock = new ReentrantLock();

                   try{

                    lock.lock();

                    需要锁定的代码

                   lock.unlock();

                    }finally{

                            lock.unlock();

                     }

    (11)线程安全的类

           A:StringBuffer

           B:Vector:需要线程安全才使用,但是即使考虑线程安全也不用,用Collections类的方法

           C:Hashtable

           D:如何把一个线程不安全的类变成一个线程安全的集合类

                       用Collections工具类的方法

                       List<String>  lsit =Collections.synchronizedList(new ArrayList<String>());

                       Map<String,String>  map =Collections.synchronizedMap(new HashMap<String,String>());

二、相关

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值