线程与进程
- 线程是比进程更快的处理单元,而且所占用的资源也小,多线程的应用,也就是性能最高的应用(相比与进程而言)
总结
- 线程的存在离不开进程。进程如果消失后,线程一定消失。线程消失后进程未必消失。
Java多线程实现
- 掌握Java中三种多线程的实现方式(JDK1.5之后增加了第三种)
如何实现:
如果想在Java中实现多线程,有两种突击:
- 继承Thread类:
- 实现Runnable接口(Callable接口)
继承Thread类
Thread类是一个支持多线程的功能类,只要有一个子类他就可以实现多线程的支持
/**
* 这是一个多线程的操作类
*/
class MyThread extends Thread{
}
Java中所有程序的“起点”是main()
方法,但是在多线程也一定要有自己的起点,那么这个起点就是 run()
也就是说,在多线程的每个主体类中都必须覆写Thread
类提供的run()
方法。
-
public void run(){}
- 这个方法上没有返回值,那么也就是表示了线程一旦开始就要一直执行,不能够返回内容。
举例:
/**
* 线程操作主类
* 这是一个多线程的操作类
*/
class MyThread extends Thread{
private String name; /* 定义类中属性 */
public MyThread(String name){ /* 定义构造方法 */
this.name = name;
}
/**
* 重写/覆写run()方法,作为线程的主体操作方法
*/
@Override
public void run() {
for (int i = 0; i < 200; i++) {
System.out.println(this.name+" -> " + i);
}
}
}
本线程类的功能是进行循环的输出操作,所有的线程与进程是一样的,都必须轮流的去抢占系统资源。也就是说,如果直接调用了run()
方法,并不能启动多现象,应该使用Thread
类中的start()
方法
public class TestDemo {
public static void main(String[] args) {
MyThread m1 = new MyThread("线程A");
MyThread m2 = new MyThread("线程B");
MyThread m3 = new MyThread("线程C");
m2.start();
m1.start();
m3.start();
}
}
/**
* 线程操作主类
* 这是一个多线程的操作类
*/
class MyThread extends Thread{
private String name; /* 定义类中属性 */
public MyThread(String name){ /* 定义构造方法 */
this.name = name;
}
/**
* 重写/覆写run()方法,作为线程的主体操作方法
*/
@Override
public void run() {
for (int i = 0; i < 200; i++) {
System.out.println(this.name+" -> " + i);
}
}
}
此时发现执行结果为线程对象交替执行。
执行结果
疑问?为什么多线程的启动不是调用的run()
而必须调用start()
?
打开Java源码,我们来观察以下start()
方法的定义
public synchronized void start() {
if (threadStatus != 0)
throw new IllegalThreadStateException();
group.add(this);
boolean started = false;
try {
start0();
started = true;
} finally {
try {
if (!started) {
group.threadStartFailed(this);
}
} catch (Throwable ignore) {
/* */
}
}
}
首先发现Thread类中start()
存在 IllegalThreadStateException
异常抛出。
网友评论