前言
线程也称轻型线程,是处理器调度的基本单位。灵活使用,可以有效的简化设计任务,提高程序执行效率。
一.线程概念
每一个程序有一个入口,一个出口,一个顺序执行的序列,执行中的程序称为进程。
进程执行中的任何指定时刻都只有一个单独的执行点。
而多线程,一个进程内部可以在同一个时刻进行多种运算。
二.线程创建
Thread()括号里可以有很多参数,也可以什么都不加。
一般实现进程有两种方式,一个是继承Thread,另一种是实现皆苦Runnable。
1.采用继承创建线程
java.lang.Thread
并重写run()来完成线程的创建。Thread类封装了现成的行为,可以创建Thread类的子类,Thread中有重要方法run()和start()
import java.lang.Thread;
public class SimpleThreadText {
public static void main(String[] args) {
//创建线程对象
Thread sum=new SumThread();
Thread squareSum=new SquareSumThread;//左边是对象名,右边对象名加了个Thread
//启动线程
Sum.start();
squareSum.start();
}
//继承Thread创建线程
class SumThread extends Thread{
public void run(){
int sum=0;
for(int i=0;i<=1000;i++)
sum+=i*i;
}
System.out.println("平方和:"+sum);
}
//继承Thread创建县城
class SquareSumThread extends Thread{
public void run(){
int sum=0;
for(int i=0;i<=1000;i++){
sum+=i;
}
System.out.println("和:"+sum);
}
}
}
不应该直接调用run()方法,而是调用start来启动线程,然后再调用run()方法。
这里给一个完整程序供大家学习参考
import java.lang.Thread;
public class MyThread extends Thread{
//变量count用于统计打印次并共享变量
private static int count=0;
public MyThread(String name){
super(name);
}
public static void main(String[] args){
//main方法开始
MyThread p=new MyThread("tl");//创建一个线程实例
p.start();//执行线程
//主线程main方法执行一个循环
for(int i=0;i<5;i++){
count++;
//主线程中打印count+"main"变量的值,并换行
System.out.println(count+":main");
}
}
public void run(){
//线程必须有的run()方法
for(int i=0;i<5;i++){
count++;
System.out.println(count+":"+this.getName());
}
}
}
2.通过实现接口创建线程
java.lang.Runnable
接口是Runnable
并没有任何对线程的支持,还必须创建Thread类的对象,然后把Runnable对象传递给Thread对象
线程的声明周期
1.线程生命周期
线程是动态的,具有一定生命周期,有四个状态。
创建状态:利用new关键词创建线程对象实例
就绪状态:处于创建状态的线程调用start()方法启动线程,将线程状态转化为就绪状态
阻塞状态:暂停一个线程的执行以等待某个条件发生
死亡状态:线程体运行结束或者调用线程对象stop方法后线程终止运行
就绪和阻塞的转化方法
1.sleep()允许指定以毫秒为单位的一段时间做参数使得线程指定时间周期内进入组赛状态,指定时间已过可以执行
2.suspend()和resume()
suspend进入阻塞并不会自动回复,resume调用则可重新执行
3.wait()和notify()放啊:
wait使线程进入阻塞,notify被调用或超出指定时间变成重新进入就绪