多线程
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.线程同步:
以上是关于多线程的主要内容,如果未能解决你的问题,请参考以下文章