一、创建
1、新建一个类,实现Runnable接口,重写run方法,在run方法内写要完成的任务,在main函数中,使用该类的对象 .run(),此时是使用main方法的线程,并非新建一个线程。
class Task implements Runnable{
@override
public void run(){
//.....................
}
}
public class TestThread{
public static void main(String[] args) {
Task task = new Task();
task.run(); //此处使用的是main方法的线程
}
}
2.新建一个类,实现Runnable接口,重写run方法,在run方法内写要完成的任务,在main函数中,将该类实例作为新建Thread的参数,该新建线程调用 .start() ,开启一个新的线程。
class Task implements Runnable{
@override
public void run(){
//.....................
}
}
public class TestThread{
public static void main(String[] args) {
Thread thread = new Thread(new Task());
thread.start(); //新启一个线程
}
}
3、新建一个类,实现Runnable接口,使用线程池
class Task implements Runnable{
@override
public void run(){
//.....................
}
}
public class TestThread {
public static void main(String[] args){
ExecutorService exec = Executors.newCachedThreadPool(); //此处使用线程池
for(int i=0;i<1;i++){
exec.execute(new Task());
}
}
}
4.直接继承Thread类
class Task extend Thread{
public void run(){
//.....................
}
}
public case class TestThread{
public static void main(String[] args) {
Task task = new task()
task.start(); //新启一个线程
}
}
二、
Runnable接口的理解:具有一个run()方法,其在线程开启时 .start() 会运行。
实现Runnable接口的类不具有创建线程的能力,其被作为构造函数的变量
Thread(Runnable target)
Thread(Runnable target, String name)
起到的作用是将一个活动的任务交给该线程。
Thread具有创建线程的能力,其常用的方法:
start
启动线程并自动执行run方法
run
包含需要执行的代码
sleep
将线程进入休眠状态,但不释放对象锁
yield
便是可以让出cpu,具体让不让由cpu决定
join
使用t.join()加入一个线程t,使用了该语句的线程将被挂起直到线程t生命结束才恢复,不过可以为join方法设置一个超时参数,若超时则join方法总能返回
interrupt
使线程中断
wait方法和notify方法
wait方法:在其他线程调用对象的notify方法或者notifyAll方法前,或者超过指定的时间量前,导致当前线程等待。线程调用wait方法,释放它对锁的拥有权,然后等待另外的线程来通知它(通知的方式是notify或者notifyAll方法),这样它才能重新获得锁的拥有权和恢复执行。
notify方法:唤醒一个等待当前对象的锁的线程。notify方法应该是被拥有对象的锁的线程所调用。被唤醒的线程是不能被执行的,需要等到当前线程放弃这个对象的锁。
notifyAll方法:唤醒所有等待锁的线程。
上面的三个方法要求在调用时线程已经获得了对象的锁,因此对这两个方法的调用需要放在synchronized方法或synchronized块中。
setDaemon
将线程设置为后台线程,需要在线程启动之前设置,isDaemon检查是否为后台线程,当所有非后台线程结束时,后天线程自动死亡
setPriority(int priorityLevel)
设置优先级(0-10),使用 getPriority()可以获取线程的优先级