多线程(一)进程与线程

版权声明:转载请说明出处 https://blog.csdn.net/qq_41816123/article/details/88725105

在这里插入图片描述
大家好,我是你们最爱的齐码,我最近想改一改作风,我很真诚,说了会分享多线程给大家。满满的干货,在看这篇文章之前,请关好门窗,防止女朋友打扰你收获这满满的干货。前往秋名山的火车就要开动的了,请系好您的安全带。
如果你对我的分享质疑,那么你是对的,我还只是工作半年不到的实习猿。
在这里插入图片描述

目录
  1. 什么是进程
  2. 什么是线程
  3. 为什么使用多线程
  4. 线程的6个状态
  5. 如何创建线程
  6. 如何终止线程
  7. 如何安全的终止线程
1.什么是进程

在这里插入图片描述
进程:操作系统的基础,是系统进行资源分配和调度的基本单位。同时也是线程的容器。
这时候就会有人质疑我了
在这里插入图片描述
定义就是这样的啊,那好吧,小弟错了,给个具体的实例好吧,打开我们Windows任务管理器,当中的exe程序就是一个进程啊,好吧还不放过我,那AndroidDevice Monitor中的Devices里面的都是进程,这总了解一点了吧
付:
在这里插入图片描述
和你们这群程序员真难交流,沉闷无趣,在看看我风趣幽默。是不是整天想这些啊,不上进,可耻,还不去加班
在这里插入图片描述

2.什么是进程

这时的我来到了第二车厢
像我们打开qq浏览器,有加载网页的,有处理缓存的,有下载与上图相关视频的,这些子任务就是线程啦,当然也可以叫它轻量级进程,线程呢都是有自己的计数器,堆栈,和局部变量等属性的,可以访问共享内存变量的

3.为什么使用多线程

最牛逼的点来了,我们为什么要使用它呢,就像你下载不良视频,你如果一个线程你告诉我,你能边下边播吗,嘿嘿,可有人又要质疑我,哎,我还是给大家讲解一下为什么使用多线程吧
在这里插入图片描述

  1. 可以减少程序的响应时间。打个比方啊,是比方,我为人正直的,假如我手机上有不良视频,但是那些我看过了,是不是像你们一样啊,腻了,要下新的,这时候手机迅雷app又要从本地读取,又要把你的BT种子添加到下载任务,使用多线程是不是就一起开始分别去做这两件事情,快很多了,嘿嘿
  2. 与进程相比,线程的创建和切换开销更小,同时多线程在数据共享方面效率非常高。
  3. 你们买手机不是喜欢看处理器吗,买那么高的处理器,不就是为了运行多个任务不卡吗,如果单个线程是不是浪费了亿万资源
4.线程的状态

车速降了,可以缓一下

  • New 新创建状态。线程被创建还没start方法
  • Runnable 可运行状态。调用start方法,但要看系统给了运行时间没
  • Blocked 阻塞状态。被锁阻塞,暂时不活动
  • Waiting 等待状态。暂时不活动,不运行任何代码,直到线程调度器激活它
  • Timed waiting 超时等待状态。和等待不同的是,在指定的时间返回
  • Terminated 终止状态。1.run完毕正常退出,2.捕获异常终止run方法
    盗用大佬图片,如有侵权,我删除
    在这里插入图片描述
    在这里插入图片描述
5.如何创建线程

说了这么多,虚无的东西可有可无,上代码才是王道。就像我们面向百度的复制粘贴工程师一样,我们简称CV工程师,没事我支持你们,我也是从无尽深渊出来的男人,我懂你们的心酸

  • 5.1继承Thread 重写run方法
package com.example.syt.myapplication;

/**
 * Created by syt on 2019/3/1.
 */

public class Text extends Thread{
    @Override
    public void run() {
        System.out.println("我是子线程");
    }

    public static void main(String[] args) {
        Text text=new Text();
        System.out.println("我是主线程");
        text.start();
    }
}
  • 5.2实现Runnable接口,实现接口方法run
package com.example.syt.myapplication;

/**
 * Created by syt on 2019/3/21.
 */

public class TestRunnable implements Runnable{
    @Override
    public void run() {
        System.out.println("我是子线程");
    }

    public static void main(String[] args) {
        System.out.println("我是主线程");
        TestRunnable mTestRunnable=new TestRunnable();
        Thread mThread=new Thread(mTestRunnable);
        mThread.start();

    }
}
  • 5.3实现Callable接口,重写call方法
package com.example.syt.myapplication;

import java.util.concurrent.Callable;

import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

/**
 * Created by syt on 2019/3/21.
 */

public class TestCallable {
    public static class MyTestCallable implements Callable {

        @Override
        public Object call() throws Exception {
            return "我是子线程";
        }

        public static void main(String[] args) {
            System.out.println("我是主线程");
            MyTestCallable myTestCallable=new MyTestCallable();
            ExecutorService executorService= Executors.newSingleThreadExecutor();
            Future mfuture=executorService.submit(myTestCallable);

            try {
                System.out.println(mfuture.get());
            }catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}
  • 5.4总结一下
    一般推荐用实现Runnable接口的方式,一个类应该在需要加强或者修改的时候才会被继承,这样比较合理。
    别迷恋我啦,我会的只是一点点,如果你继续迷恋我,前面的当我没说
    在这里插入图片描述
6. 如何终止线程

在很久很久以前,我以追溯不到了,线程是用stop方法终止的,但是现在用这个interrupt方法比较很合理,线程会不时地检查中断标识位,interrupt方法就是将中断标识位置位。
看看我们的代码

package com.example.syt.myapplication;

import java.util.concurrent.TimeUnit;

/**
 * Created by syt on 2019/3/21.
 */

public class StopThread {
    public static void main(String[] args) throws InterruptedException {
        MoonRunner runner=new MoonRunner();
        Thread thread=new Thread(runner,"MoonThread");
        thread.start();
        TimeUnit.MILLISECONDS.sleep(10);
        runner.interrupt();
    }
    public static class MoonRunner implements Runnable{
        private long i;
        @Override
        public void run() {
            while (on){
                i++;
                System.out.println("i="+i);
            }
            System.out.println("stop");
        }
    }
}
7. 如何安全的终止线程

直接上代码

package com.example.syt.myapplication;

import java.util.concurrent.TimeUnit;

/**
 * Created by syt on 2019/3/21.
 */

public class StopThread {
    public static void main(String[] args) throws InterruptedException {
        MoonRunner runner=new MoonRunner();
        Thread thread=new Thread(runner,"MoonThread");
        thread.start();
        TimeUnit.MILLISECONDS.sleep(10);
        runner.cancel();
    }
    public static class MoonRunner implements Runnable{
        private long i;
        private volatile boolean on=true;
        @Override
        public void run() {
            while (on){
                i++;
                System.out.println("i="+i);
            }
            System.out.println("stop");
        }
        public void cancel(){
            on=false;
        }
    }
}

没有,我真没有糊弄你们,它们是有区别的,看到这段代码吗

private volatile boolean on=true;

这个volatile就厉害啊,多个线程可以对它进行访问,其他线程就会感受到它的变化,嘿嘿。我就可以在其它线程关闭它了,这样不是安全点吗,你背着你女朋友看小视频,女朋友进来了,还不让点击关闭啊。
如果写的不好请指出,后续会继续分享多线程相关的文章,QQ2714730493

在这里插入图片描述

奇淫巧计,为求一赞

猜你喜欢

转载自blog.csdn.net/qq_41816123/article/details/88725105