美文网首页
Java语言中的多线程

Java语言中的多线程

作者: 黑铁选手 | 来源:发表于2019-08-19 21:27 被阅读0次

    目的

    熟练的掌握Java语言的进程,线程,多线程。学会运用

    相关技术,及其使用

    1、进程:正在运行的一个程序,系统会为这个进程分配独立的内存空间

    2、线程:具体执行任务的最小单位,一个进程多少拥有一个线程(主线程 运行起来就要执行的线程 )。
    (1)线程之间是共享内存资源的(进程申请的内存资源),一个线程就是独立完成一个任务。
    (2)线程之间可以通信(数据传递)但是多数情况下为主线程和子线程之间的通讯
    (3)每一个线程都有自己的运行回路(生命周期)
    (4)每次线程运行的结构都是不唯一的

    3、线程的生命周期(线程的状态)
    NEW:新建 线程刚被创建好
    RUNNABLE:就绪状态 只要抢到时间片就可以运行这个程序
    BLOCKED :阻塞状态 sleep 时间片结束 wait sleep时间结束notify就重新回到就绪状态
    WAITING:等待 wait
    TIMED_WAITING
    TERMINATED : 终止

    4、为什么需要创建子线程
    (1)如果在主线程中存在比较耗时的操作:下载视频 上传文件 数据处理
    (2)这些操作会阻塞主线程,后面的任务必须等这些任务执行完毕之后才能执行,用户的体验比较差
    (3 为了不阻塞主线程,需要将好事的任务存方法子线程中去处理

    5、如何创建一个子线程
    (1)协议类继承于Thread 实现run方法
    (2)实现Runnable接口 实现run方法:
    a、创建任务 创建类实现Runnable接口
    b、使用Thread 为这个任务分配线程
    c、开启任务start

    class PXDThread implements Runnable {
        public void run() {
            for(int i = 1;i <=100;i++){
                System.out.println(Thread.currentThread().getName()+i);
            }
        }
    }
    //创建Thread对象开启任务
            //main 方法里面执行的代码都是在主线程里面执行的
      TestThread tt = new TestThread();
            tt.start();
    

    6、操作线程里面所需的方法
    (1)join:让当前这个线程阻塞 等join的线程执行完毕在执行
    (2)setName:设置线程名称

      //创建Thread对象
            TestThread tt = new TestThread();
            //设置线程的名称
            tt.setName("子线程");
    

    (3)getName:获取线程名称

    String name=  Thread.currentThread().getName();
    

    (4)currentThread:获取当前运行的线程对象

      Thread t = new Thread(new Runnable() {
                @Override
                public void run() {
                    for(int i = 1;i <=100;i++){
                        System.out.println(Thread.currentThread().getName()+i);
                    }
                }
            });
    

    (5)start:开启线程

    
            Thread t2 = new Thread(pt);
            t2.setName("子线程2");
            t2.start();//开启任务
    

    7、线程安全
    Synchronized、线程同步
    Lock 加锁解锁
    ReentraintLock 可重入锁
    任何一个对象都有自己的一把锁,如果多个线程操作同一个代码块,必须需要同步,那么必须操作同一哥对象/同一把锁。
    方法:
    (1)同步代码块
    synchronized(监听器、对象、锁){
    需要同步的代码
    }

        test();
        public synchronized void test() {
            for (int i = 1; i <= 100; i++) {
                //需要同步的代码
                if (num > 0) {
                    System.out.println(name + "出票:" + num);
                    num--;
                } else {
                    break;
                }
            }
    

    (2)同步方法
    必须确保多个对象调用的同方法时操作的同一个对象
    public synchronized void test() {
    本质就是同步代码块
    等价于
    synchronized(this){
    test();
    }
    8、线程之间的通讯:
    synchronized (wait notify notifyAll)
    ReentrantLock lock;
    Condition c =lock.newCondition()
    await single singleAll

    ps

    今天学习的线程,简单但是挺重要的,简单的东西都会被忽略掉,现在学的这些只是还没到用的时候,所以都是不怎么懂,我想等到了下一个阶段,我应该会掌握的更牢固。

    相关文章

      网友评论

          本文标题:Java语言中的多线程

          本文链接:https://www.haomeiwen.com/subject/pioesctx.html