多线程

Posted panzer

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程相关的知识,希望对你有一定的参考价值。

1.线程的概念:

多线程使得程序中的多个任务可以同时执行。Java的重要功能之一就是内部支持多线程,在一个程序中运行同时运行多个任务。

线程:一个程序可能包含多个同时运行的任务。线程是指一个任务从头至尾的执行流程。

在java中,每个任务都是Runnable接口的一个实例,也称为可运行对象(runnable object).线程本质上讲就是便于任务执行的对象。

2.创建任务和线程:

      一个任务类必须实现 Runnable接口。任务必须从线程运行。

实例:

第一个任务打印字符 a 100次;

第二个任务打印字符 b 100次;

第三个任务打印字符 1到100的整数;

这三个线程讲共享CPU,并且在控制台上轮流打印字母和数字。

package TaskThread;

public class TaskThreadDemo {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        Runnable printA = new PrintChar(‘a‘, 100);
        Runnable printB = new PrintChar(‘b‘, 100);
        Runnable print100 = new PrintNum(100);
        
        Thread thread1 = new Thread(printA);
        Thread thread2 = new Thread(printB);
        Thread thread3 = new Thread(print100);
        
        thread1.start();
        thread2.start();
        thread3.start();

    }

}

class PrintChar implements Runnable{
    private char charToPrint;
    private int times;
    
    public PrintChar(char c ,int t) {
        charToPrint = c;
        times = t;
    }

    @Override
    public void run() {
        // TODO Auto-generated method stub
        for(int i = 0; i < times; i++) {
            System.out.println("PrintChar" + charToPrint);
        }
    }
    
}

class PrintNum implements Runnable{
    private int lastNum;

    public PrintNum(int n) {
        lastNum = n;
    }
    @Override
    public void run() {
        // TODO Auto-generated method stub
        for (int i = 0; i <= lastNum; i++) {
            System.out.println(" " + i);
        }
    }
    
}

调用start()方法启动一个线程,它会导致任务中的run()方法被执行。

 

3.Thread类:

Thread类包含为任务而创建的线程的构造方法,以及控制线程的方法。 

 方法 sleep(long mills) 可以将改线程设置为休眠以保障其他线程的执行。如果一个循环中调用了sleep方法,那就应该讲这个循环放在try-catch块中。

 

4.线程池:

可以使用线程池来高效的执行任务。

线程池是管理并发执行任务个数的理想方法。Java提供Executor接口来执线程池中的任务,提供ExecutorService接口来管理和控制任务。

ExecutorService executor = Executors.newFixedThreadPool(3); 创建了一个最大线程数为3的线程池执行器。
package TaskThread;

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

public class ExecutorsDemo {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        ExecutorService executor = Executors.newFixedThreadPool(3);
        
        executor.execute(new PrintCharA(‘a‘,150));
        executor.execute(new PrintCharA(‘b‘,180));
        executor.execute(new PrintNumA(190));

        executor.shutdown();

    }

}

class PrintCharA implements Runnable{
    private char charToPrint;
    private int times;
    
    public PrintCharA(char c ,int t) {
        charToPrint = c;
        times = t;
    }

    @Override
    public void run() {
        // TODO Auto-generated method stub
        for(int i = 0; i < times; i++) {
            System.out.println("PrintChar" + charToPrint + "--" + i);
        }
    }
    
}

class PrintNumA implements Runnable{
    private int lastNum;

    public PrintNumA(int n) {
        lastNum = n;
    }
    @Override
    public void run() {
        // TODO Auto-generated method stub
        for (int i = 0; i <= lastNum; i++) {
            System.out.println(" " + i);
        }
    }
    
}

 

 

shutdown()通知执行器关闭。不能接受新的任务,但是现有的任务将继续执行直至完成。

 

5.线程同步:

 

以上是关于多线程的主要内容,如果未能解决你的问题,请参考以下文章

线程学习知识点总结

多个请求是多线程吗

python小白学习记录 多线程爬取ts片段

多线程编程

多线程编程

python多线程