文章目录
- Java多线程
- 引言
- 线程的概念
- 创建任务和线程
Java多线程
引言
Java的重要功能之一就是内部支持多线程–在一个程序中允许同时运行多个任务。在许多程序设计中语言中,多线程都是依赖于系统的过程或函数来实习的。接下来我们介绍线程的概念以及如何在java中开发多线程。
线程的概念
一个程序可能包含多个并发运行的任务。线程(thread)是指一个任务从头至尾的执行流。对java而言,可以在一个程序中并发的启动多个线程。这些线程可以在多处理器系统上同时运行,如下图:
在单处理其系统中,多个线程共享CPU时间成为时间共享,操作系统负责调度及分配资源给他们。如下图
多线程可以是程序反应更快、交互性更强、执行效率更高。在Java中,每个任务都是Runnable接口的一个实例,也可成为运行对象(runnable object)。线程本质上讲的就是便于任务执行的对象。
创建任务和线程
任务就是对象。为了创建任务,必须首先为任务定义一个类。任务类必须实现Runnale接口。Runnable接口非常简单,他只包含了一个run方法。需要实现这个方法来告诉线程应该怎样运行。
Java虚拟机通过调用任务的run()方法执行任务。下面的代码概括了创建一个任务、一个线程、
以及开始线程的主要步骤
//Custom task calss
public class TaskClass implements Runnable {
public TaskClass() {}
//Implemnets the run method in Runnable
public void run() {
//Tell system how to rn custom thread
}
}
//Client class
public class Client {
public void someMethod() {
//Create an instance of TaskClass
TaskClass task = new TaskClass();
//Create a thread
Thread thread = new Thread(task);
//start a thread
thread.start();
}
}
下面,我们写一个小代码,测试一下。
需求:
1、打印字母 ”a“ 100次。
2、打印字母 ”1–100“ 的整数。
3、打印符号”#“ 100次。
如果运行这个程序,则三个线程将共享cpu。在控制台轮流打印字母a,数字,#。
下面上代码:
package test3;
/**
* @author changxing.guo
*/
public class ThreadTaskDemo {
public static void main(String[] a) {
//create tasks
Runnable printA = new PrintChar('a', 100);
Runnable printNum = new PrintNum();
Runnable printX = new PrintChar('#', 100);
//create threads
Thread threadA = new Thread(printA);
Thread threadNum = new Thread(printNum);
Thread threadX = new Thread(printX);
//Start threads
threadA.start();
threadNum.start();
threadX.start();
}
}
//创建一个打印字母的任务类
class PrintChar implements Runnable {
private char charToPrint; //要打印的字母
private int times; //打印次数
//构造函数
public PrintChar() {};
public PrintChar(char c, int n) {
this.charToPrint = c;
this.times = n;
}
//实现Runnable接口的run方法,里面添加自己要执行的逻辑
@Override
public void run() {
for (int i=0; i<times; i++) {
System.out.print(charToPrint);
}
}
}
//创建打印数字的任务类
class PrintNum implements Runnable {
private int lastNum = 100;
@Override
public void run() {
for (int i = 0; i <= lastNum; i ++) {
System.out.print(" " + i);
}
}
}
该程序创建了三个任务,为了同时运行他们,创建三个线程。调用start()方法启动一个线程。当run()方法执行完毕,线程就终止。