要理解线程,首先要理解进程
在java中任何一个类都可以作为一个线程来使用。
两种实现线程方法的区别:
//创建一个Cat对象
Cat cat=new Cat();
//启动线程,会导致run函数的自动运行
cat.start();
Dog dog=new Dog();
//线程启动(不同于thread继承的方法,Runable实现的方法得先创建一个线程)
//1、创建一个Thread对象
//2、启动该线程
Thread t=new Thread(dog);
t.start();
实例:
/**
* 功能:线程的使用------如何通过继承Thread来开发线程
*/
package com.xiancheng;
public class Demo1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
//创建一个Cat对象
Cat cat=new Cat();
//启动线程,会导致run函数的自动运行
cat.start();
}
}
class Cat extends Thread{
int times=0;
//重写run函数
public void run() {
while (true) {
//休眠一秒(1000毫秒),sleep使该线程进入Blocked(阻塞)
//状态,并释放资源
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("每隔一秒该线程运行一次");
times++;
if (times==10) {
//退出-----意味着线程死亡(结束)
break;
}
}
}
}
可运行状态下,若内存等满足,则系统(或JVM)自动调度,(这些条件是系统自动判断的,一般花费时间极短)线程进入运行状态;
运行状态下,由于线程的sleep()函数或内存不足等原因,线程会进入阻塞状态;
阻塞状态下,sleep()函数结束/内存等再次使得程序可顺利运行,线程再次进入可运行状态
/**
* 线程------通过实现Runable接口,并重写run函数来实现线程
*/
package com.xiancheng;
public class Demo2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Dog dog=new Dog();
//线程启动(不同于thread继承的方法,Runable实现的方法得先创建一个线程)
//1、创建一个Thread对象
//2、启动该线程
Thread t=new Thread(dog);
t.start();
}
}
class Dog implements Runnable{
int times=0;
@Override
public void run() {
// TODO Auto-generated method stub
while (true) {
//休眠一秒(1000毫秒),sleep使该线程进入Blocked(阻塞)
//状态,并释放资源
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("每隔一秒该线程运行一次");
times++;
if (times==10) {
//退出-----意味着线程死亡(结束)
break;
}
}
}
}