一、线程与进程
1、线程:程序中单独顺序的控制流
线程本身是依靠程序进行运行,线程是程序中的顺序控制流,只能使用分配给程序的资源和环境。
2、进程:执行中的程序
一个进程可以包含一个或多个线程,即至少包含一个线程。
3、单线程:程序中只存在一个线程,实际上主方法(main函数)就是一个主线程。
4、多线程:多线程是在一个程序中运行多个任务,其目的是更好的使用CPU资源。
二、线程的实现
1、JAVA中,线程的实现有2种:
- 继承Thread类
- 实现Runnable接口
2、Thread类
Thread类是在java.lang包中定义的,继承和Thread类必须重写run()方法。如下:
public class className extends Thread{
run();//需重写
}
3、Runnable接口 如下:
public class className Implements Runnnable{
代码块
}
注意:
启动线程需调用start(),并不是调用run()方法,run()其实就是一个线程的入口
如下:
//定义MyThread类,继承Thread类
public class MyThread extends Thread{
private String name;
public MyThread(String name){//构造方法传参,标识当前的线程
this.name = name;
}
//重写run()方法
public void run(){
for(int i = 0; i < 100; i++){
System.out.println(name + ":" + i);
}
}
}
public class ThreadDemo{
public static void main(String[] args){
MyThread t = new MyThread("A");
t.start();
}
}
无论是继承Thread类还是实现Runnable接口都需要重写run方法,但是Runnable这个接口没有Thread类中的start(),所以要通过Thread类中的start()来启动线程。如下:
//定义MyRunnable类实现Runnable接口
public class MyRunnable implements Runnable{
private String name;
public MyRunnable(String name){
this.name = name;
}
public void run(){
for(int i = 0; i < 100; i++){
System.out.println(name + ":" + i);
}
}
}
public class RunnableDemo{
public static void main(String[] args){
MyRunnable r = new MyRunnable("B");//创建对象
//通过Thread启动线程
Thread t = new Thread(r);
t.start();
}
}
三、线程的状态
线程有固定的操作状态
创建状态:准备好了一个多线程的对象
就绪状态:调用了start()方法,等待CPU进行调度(即分配资源)
运行状态:执行run()方法
阻塞状态:暂时停止执行,可能将资源交给其他线程使用
终止状态(死亡状态):线程销毁
四、线程的常用方法
线程的常用方法基本都在Thread类当中,所以大多通过Thread类调用。
1、取得线程名称
getName()
2、取得当前线程对象
currentThread()
3、判断线程是否启动
isAlive()
4、线程的强行运行
join()
5、线程的休眠
sleep()
6、线程的礼让
field()
五、同步与死锁
1、同步代码块
在代码块上加上”synchronized”关键字,则此代码块就称为同步代码块
2、同步代码块格式:
synchronized(同步对象){
需要同步的代码块;
}
3、同步方法
除了代码块可以同步,方法也是可以同步的
格式:
synchronized void 方法名(){}
六、线程优先级
优先级顺序设置:
- 1-MIN_PRIORITY
- 10-MAX_PRIORITY
- 5-NORM_PRIORITY
如果什么都不设置默认值是5。调用Thread类里的setPriority()即可选择优先级大小。
注意:
线程的优先级会影响线程的执行顺序,这里指的是有可能影响,不会一定影响。
如下:
//以下是主函数里设置了优先级,C最大B次之A最小
Thread t1 = new Thread(new ThRun(),"A");
Thread t2 = new Thread(new ThRun(),"B");
Thread t3 = new Thread(new ThRun(),"C");
t1.setPriority(Thread.MIN_PRIORITY);
t2.setPriority(Thread.NORM_PRIORITY);
t3.setPriority(Thread.MAX_PRIORITY);
t1.start();
t2.start();
t3.start();
可以看到第一、二趟是B最先执行而不是C,之后的三趟才是C最先,因此优先级有可能影响,不会一定影响
B:0
A:0
C:0
B:1
C:1
A:1
C:2
B:2
A:2
C:3
B:3
A:3
C:4
B:4
A:4