Thread
start方法
start()用来启动一个线程,当调用start方法后,系统才会开启一个新的线程来执行用户定义的子任务,在这个过程中,会为相应的线程分配需要的资源。
run方法
run()方法是不需要用户来调用的,当通过start方法启动一个线程之后,当线程获得了CPU执行时间,便进入run方法体去执行具体的任务。注意,继承Thread类必须重写run方法,在run方法中定义具体要执行的任务。
sleep方法
sleep方法有两个重载版本:
sleep(long millis) //参数为毫秒
sleep(long millis,int nanoseconds) //第一参数为毫秒,第二个参数为纳秒123
sleep相当于让线程睡眠,交出CPU,让CPU去执行其他的任务。
写个多线程康康:
package com.company.tread;
public class Dome1 extends Thread{
@Override
public void run(){
for (int i = 0; i < 10;i++){
System.out.println(Thread.currentThread().getName()+"-----"+i);
//线程睡眠
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
//创建线程
Dome1 t1 = new Dome1();
Dome1 t2 = new Dome1();
//开始线程
t1.start();
t2.start();
}
}
这里可以看出线程是交替运行的, 线程的调度是机器自动来进行。
Runnable
Runnable与Thread的区别:
- Runnable 是接口;
- Thread 是类,且实现了Runnable接口。
- 在使用Runnable定义的子类中没有start()方法,只有Thread类中才有。
- Runnable接口是一个功能接口,并且具有单一的run()不接受任何参数,并且不返回任何值的方法。
在程序开发中多线程主要以实现Runnable接口为主。
Java多线程实现Runnable方式的具体方法步骤:
- 定义实现Runnable接口
- 覆盖Runnable接口中的run方法,将线程要运行的代码存放在run方法中。
- 通过Thread类建立线程对象。
- 将Runnable接口的子类对象作为实际参数传递给Thread类的构造函数。
- 调用Thread类的start方法开启线程并调用Runnable接口子类run方法。
package com.company.tread;
//创建runnbale接口的实现类对象
public class Test implements Runnable{
//覆写run方法
@Override
public void run() {
for (int i = 0; i <=10; i++) {
System.out.println(Thread.currentThread().getName()+"--->"+i);
}
}
public static void main(String[] args) {
//创建runnbale接口的实现类对象
Test t1 = new Test();
Test t2 = new Test();
Test t3 = new Test();
//创建线程对象,通过线程对象来开户我们的线程,代理
new Thread(t1).start();
new Thread(t2).start();
new Thread(t3).start();
}
}
Callable
- Callable规定的方法是call(),而Runnable规定的方法是run()。
- Callable的任务执行后可返回值,而Runnable的任务是不能返回值的。
- call()方法可抛出异常,而run()方法是不能抛出异常的。
- 运行Callable任务可拿到一个Future对象。
package com.company.tread;
import java.util.concurrent.*;
import static java.util.concurrent.Executors.newFixedThreadPool;
public class Test1 implements Callable <Boolean>{
//这里覆写的方法是call
@Override
public Boolean call() {
for (int i = 0; i <=10; i++) {
System.out.println(Thread.currentThread().getName()+"--->"+i);
}
return null;
}
public static void main(String[] args) throws ExecutionException, InterruptedException {
// 定义3个Callable类型的任务
Test1 t1 =new Test1();
Test1 t2 =new Test1();
Test1 t3 =new Test1();
//创建执行服务
ExecutorService ser = newFixedThreadPool(3);
//提交执行
Future<Boolean> r1 = ser.submit(t1);
Future<Boolean> r2 = ser.submit(t2);
Future<Boolean> r3 = ser.submit(t3);
//获取结果
//关闭服务
ser.shutdown();
}
}