一、什么是线程
线程是计算机系统用来执行任务的最小单位
二、程序、进程、线程
程序:存放在电脑硬盘的指令文件的集合
进程:程序运行时内存中的一块空间,是动态的,一个进程会控制多个任务的进行,且任务时同时进行的
线程:线程是执行任务的最小单位,一个进程可能会执行多个线程
三、线程的好处
线程可以实现多个任务的并行和并发
并行:就是多个任务同时进行
并发:看起来是多个任务在同时进行的,其实在一个时间点上是只有一个任务在运行
使用线程的目的是为了让多个任务同时进行,当cpu在运行多个任务时,是随件给每个任务发放一段时间片,每个任务就在这个时间片的时候运行(时间片就是一段极短的时间),这样看起来就相当于多个任务在同时进行
四、实现线程的方法
1.继承Thread
Thread就是线程
创建一个线程对象
new Thread();
给线程分配任务
执行一个线程就是执行这个线程中的run方法,当一个类继承Thread时需要重写run方法
启动线程
启动线程的方法void start();
代码详解
public class Demo1 {
public static void main(String[] args) {
Dog dog = new Dog();//创建一个Dog对象,因为Dog类继承了Thread类,所以就相当于创建了一个Thread对象
dog.start();//启动线程
}
}
class Dog extends Thread{
@Override//重写run方法
public void run() {
for (int i = 0; i < 1000; i++) {
System.out.println("我吃骨头");
}
}
}
2.实现Runnable
此接口表示的是线程任务而不是线程,如果一个类实现了这个接口,则表示创建了一个线程任务,后面还是需要创建Thread线程对象来接受这个线程任务
new Thread(Runnable r):创建线程任务的同时指派任务
自定义实现Runnable
public class Demo2 {
public static void main(String[] args) {
Dog2 dog2 = new Dog2();//创建Dog2对象,因为这个对象实现了Runnable接口,则相当于创建了这个类的线程方法
Thread t1 = new Thread(dog2);//创建一个线程对象
t1.start();//启动线程
}
}
class Dog2 implements Runnable{//实现接口
@Override//重写run方法
public void run() {
for (int i = 0; i < 1000; i++) {
System.out.println("woc");
}
}
}
3.实现Callable
实现Callable的方式来创建一个线程的好处是会有一个返回值
使用方式:new Thread(FutureTask的实现类对象)
然后在实现类中重写call方法
自定义实现Callable
public class Demo4 {
public static void main(String[] args) throws ExecutionException, InterruptedException {
Dog3 dog3 = new Dog3();//创建一个Dog3对象
FutureTask task1 = new FutureTask(dog3);//创建一个FutureTask对象,同时将Dog3对象传进去
Thread t1 = new Thread(task1);//创建一个Thread线程对象
t1.start();//启动线程
System.out.println(task1.get());
}
}
class Dog3 implements Callable{//实现Callable接口
@Override//重写call方法
public Object call() throws Exception {
for (int i = 0; i < 10000; i++) {
System.out.println("你好java");
}
return 1;
}
}
三、线程常用方法
1.名称相关方法
new Thread(String name):给当前线程取名
new Thread(Runnable target, String name):创建线程的同时指定线程的名称
String getName():获取线程对象的名称
void setName():给线程对象名称赋值
static Thread currentThread:获取当前线程
public class Demo5 {
public static void main(String[] args) {
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("我吃什么了:" + Thread.currentThread().getName());
}
},"再见了妈妈");
t1.start();
}
2.优先级相关方法
int getPriority():获取当前线程的优先级
void setPriority(int i):给当前线程设置优先级
优先级最大值为10
优先级最小值为1
如果不设置优先级,则系统默认优先级为5
public class Demo6 {
public static void main(String[] args) {
Thread t1= new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 20000; i++) {
System.out.println("你在干什么");
}
}
});
Thread t2= new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 20000; i++) {
System.out.println("我在吃饭呢");
}
}
});
System.out.println(t1.getPriority());
System.out.println(t2.getPriority());
t1.setPriority(Thread.MAX_PRIORITY);//调用Thread中的优先级最大值
t2.setPriority(Thread.MIN_PRIORITY);//调用Thread中的优先级最小值
t2.start();
t1.start();
}
}
效果演示:
注意:优先级设置后只是让cpu分给优先级高的任务的时间片的几率高了,并不是一定会先执行完优先级高的任务