java多线程

多线程 Java.Thread

1、线程简介

进程和线程都是一个时间段的描述,是CPU工作时间段的描述。是运行中的程序指令的一种描述,这需要与程序中的代码区别开来。

电脑 = CPU + RAM +各种资源

电脑的运行 = CPU、寄存器、RAM的交互

  • CPU速度 >= 寄存器速度 >> RAM速度

  • 若多个任务需要执行时,则轮流使用CPU(在不同的策略下轮流的概念有偏差),但因为CPU速度很快,所以在外界看来时同时进行。

  • 在任何程序想要使用cpu之前,其他所需资源需要到位,处于就绪队列中,用调度算法调用执行

  • 进程的上下文环境 = 进程执行时环境 = 除CPU以外的所有执行环境,(主要是寄存器)

  • 先加载进程A的上下文,然后开始执行A,保存进程A的上下文,调入下一个要执行的进程B的进程上下文,然后开始执行B,保存进程B的上下文

进程和线程就是对应不同的CPU时间段的描述,线程共享同一进程的资源

进程是资源分配的最小单位

线程是CPU调度的最小单位


此处的线程指的是Java线程

2、线程的创建

名称 属性 简介
Thread 继承Thread类
Runnable 接口 实现Runnable接口
Callable 接口 了解Callable接口

优先级:当某个线程中创建一个新的Thread对象时,新线程的优先级=创建线程的优先级

守护进程:守护进程能自动结束自己的生命周期,即便是有死循环也能轻松面对;

非守护进程:不能自动结束自己的生命周期,main进程就是一个典型的非守护进程

执行过程:主线程和子线程并行交替执行

注:线程不一定执行,看cpu调度安排

2.1、Thread创建线程

创建步骤:

  • 创建一个新的类,用来继承Thread

  • 重载run方法

  • 用start方法启用该线程

public class TestThread extends Thread{
    long prime;
    TestThread(long prime){
        this.prime = prime;
    }
    @Override
    public void run() {
        this.prime += 1;
        System.out.println("该数已经加一"+this.prime);
    }

    public static void main(String[] args) {
        TestThread thread = new TestThread(15);
        thread.start();
    }
}

实例:

  • 用commons-io包来多线程下载图片

    public class TestThread2 extends Thread{
        String url;
        String fileName;
        TestThread2(String url, String fileName){
            this.fileName = fileName;
            this.url = url;
        }
    
        @Override
        public void run() {
            WebDownload webDownload = new WebDownload();
            webDownload.downloader(this.url,this.fileName);
            System.out.println("下载的文件名为"+this.fileName);
        }
    
        public static void main(String[] args) {
            TestThread2 thread = new TestThread2("https://t7.baidu.com/it/u=1595072465,3644073269&fm=193&f=GIF"
                                                    ,"1.jpg");
    
            TestThread2 thread2 = new TestThread2("https://t7.baidu.com/it/u=1595072465,3644073269&fm=193&f=GIF"
                    ,"2.jpg");
    
            TestThread2 thread3 = new TestThread2("https://t7.baidu.com/it/u=1595072465,3644073269&fm=193&f=GIF"
                    ,"3.jpg");
    
            thread.start();
            thread2.start();
            thread3.start();
            System.out.println("程序结束");
        }
    }
    
    class WebDownload{
        public void downloader(String url, String fileName){
            try {
                FileUtils.copyURLToFile(new URL(url),new File(fileName));
            } catch (IOException e) {
                e.printStackTrace();
                System.out.println("IO异常,downloader方法出现问题");
            }
        }
    }
    

2.2、Runnable接口创建进程

创建步骤

  • 创建一个新的类,用来实现Runnable接口

  • 重载run方法

  • 把新类对象作为创建Thread对象的实参

  • 用Thread对象的start方法启用该线程

public class TestRunnable implements Runnable{
    long prime;
    TestRunnable(long prime){
        this.prime = prime;
    }
    @Override
    public void run(){
        this.prime += 1;
        System.out.println("prime改变了吗"+this.prime);
    }

    public static void main(String[] args) {
        TestRunnable thread = new TestRunnable(10);
        new Thread(thread).start();
    }
}
posted @ 2022-01-29 16:33  赵来东  阅读(29)  评论(0编辑  收藏  举报