与其战胜敌人一万次,不如战胜自己一次。
本讲内容:线程
一、什么是线程?(譬如:打开一个迅雷进程,可以有多个文件同时下载(即多个线程运行))
1、线程是轻量级的进程。
2、线程没有独立的地址空间(内存空间)
3、线程是由进程创建的(寄生在进程)
4、一个进程可以拥有多个线程(这就是我们常说的多线程编程)
5、线程有五种状态:
新建状态(new)、就绪状态(Runnable)、运行状态(Running)、阻塞状态(Blocked)、死亡状态(Dead)。
二、如何使用线程
在java中一个类要当作线程来使用有两种方法
1、继承Thread类、并重写run方法。
2、实现Runnable接口,并重写run方法。
两种方式比较:
Runnable方式可以避免Thread方式由于Java单继承性带来的缺陷
Runnable的代码可以被多个线程共享,适合于多个线程处理同一资源的情况(如共享总票数)。
三、两种方法的区别
本质上没有区别,从jdk帮助文档我们可以看到Thread类本身就实现了Runnable接口。
1、尽可能使用实现Runnable接口的方式来创建线程。
2、启动线程方式不同。
四、注意:不管是通过继承还是通过实现接口创建线程,它们的一个对象只能启动(即:start())一次,否则就会有异常抛出。
下面我们通过例子分别用二种方法实现:
示例一:每隔一秒,在控制台输出“hello,world”,当输出10次后,自动退出
1、继承Thread类、并重写run方法。
public class Text{
public static void main(String[] args) {
Student stu=new Student();
stu.start();//启东线程 会导致run函数的运行
}
}
class Student extends Thread{
int times=0;
public void run() {//重写run 函数
while(true){
try {//休眠一秒 以毫秒为单位
// sleep就会让线程进入到阻塞状态,并释放资源
//这个线程会自动休息一秒休息过后 线程会自动运行
Thread.sleep(1000);
} catch (Exception e) {
// TODO: handle exception
}
times++;
System.out.println("hello,world"+times);
if(times==10){
break;
}
}
}
}
2、实现Runnable接口,并重写run方法。
public class Text{
public static void main(String[] args) {
Student stu=new Student();
//创建一个线程对象
Thread t=new Thread(stu);
// 必须定义个一线程对象 然后把 实现 Runnable接口的对象包括里面
t.start();
}
}
class Student implements Runnable{
int times=0;
public void run() {//重写run 函数
while(true){
try {
Thread.sleep(1000);
} catch (Exception e) {
// TODO: handle exception
}
times++;
System.out.println("hello,world"+times);
if(times==10){
break;
}
}
}
}
示例二:多线程实例(说明线程不同步)
public class Text{
public static void main(String[] args) {
Student stu=new Student();
Dog dog=new Dog();
Thread t1=new Thread(stu);
Thread t2=new Thread(dog);
t1.start();
t2.start();
}
}
class Student implements Runnable{
int times=0;
public void run() {//重写run 函数
while(true){
try {
Thread.sleep(10);//阻塞0.01秒为了方便比较结果
} catch (Exception e) {
// TODO: handle exception
}
times++;
System.out.println("人类线程在运行"+times);
if(times==10){
break;
}
}
}
}
class Dog implements Runnable{
int times=0;
public void run() {//重写run 函数
while(true){
try {
Thread.sleep(10);
} catch (Exception e) {
// TODO: handle exception
}
times++;
System.out.println("动物线程在运行中……"+times);
if(times==10){
break;
}
}
}
}
动物线程在运行中……1
人类线程在运行1
动物线程在运行中……2
人类线程在运行2
动物线程在运行中……3
人类线程在运行3
动物线程在运行中……4
<span style="color:#ff0000;">人类线程在运行4
人类线程在运行5</span>
<span style="color:#ff0000;">动物线程在运行中……5
动物线程在运行中……6</span>
人类线程在运行6
动物线程在运行中……7
人类线程在运行7
动物线程在运行中……8
人类线程在运行8
动物线程在运行中……9
<span style="color:#ff0000;">人类线程在运行9
人类线程在运行10</span>
动物线程在运行中……10
本讲就到这里,Take your time and enjoy it