1.我们为什么要使用多线程
使用多线程的根本原因是为了让计算机学会在同一时间执行不同的事情,而不是单纯为了效率。有的时候可能会必须使用多线程但效率低下。
2.线程五大状态:
新生(Born) 就绪(Runnable)运行(Running)消亡(Dead)
阻塞(Blocking)
3.如何使用线程
(1)extends Thread
(2)implements Runnable
(3)implements Callable<T>
import java.util.concurrent.*;
public class test{
public static void main(String[] args){
ExecutorService es = Executors.newFixedThreadPoll(2);//注意传参数
//.newSingleThreadExecutor();
//.newCachedThreadPoll();
ThreadTest t = new ThreadTest();
t.start();//启动线程使用.start方法而不是调用run方法
ThreadTest2 t1 = new ThreadTest2();
Thread t2 = new Thread(t1);//注意传参
t2.start();
//使用第三种方法涉及使用线程池,而且必须使用线程池
ThreadTest3 t3 = new ThreadTest3();
Future<String> f = es.submit(t3)
System.out.println("可以继续完成一些其它事情");
String s = f.get();//调用该方法会使下面的语句必须等待其结束才能继续
System.out.println(s);
es.shutdown();
}
}
class ThreadTest extends Thread{
public void run(){
System.out.println("线程运行1");
}
}
class ThreadTest2 implements Runnable{
public void run(){
System.out.println("线程运行2");
}
}
class ThreadTest3 implements Callable<String>{
public String call() throws Exception{
System.out.println("线程运行3");
}
}
4.如何控制线程(线程可以使用的方法)
.setPriority(int):设置线程的优先级,可从1-10选择,默认为5.优先级高的更容易抢到时间片
.sleep(long):让当前线程休眠指定毫秒数
.yield()让当前线程放弃已经到手的时间片,返回就绪状态->继续重新回到队伍争夺时间片,所以有可能下一个还是它
.join()让当前线程邀请另一个先执行,被邀请的依然要与就绪态里其它等待的线程争夺,只是竞争对手少了一个。邀请的那个进入阻塞态,直到被邀请的结束才会回到就绪态
其中,sleep与yield两个方法调用时,只影响当前执行的线程,与谁调用的线程无关
而sleep与join因为会使线程进入休眠状态是不安全的,因此需要进行异常处理
以下是常见的普通方法
setName(),getName():用于获得和设置线程名字(常用)
activeCount():统计程序当中所有活跃(就绪,运行,阻塞)状态的线程总数
setDaemon(true):设置线程成为守护线程
为了给其他线程提供服务,当所有线程(除了它自己)执行结束后,会自行消亡(守护线程一般都是while true死循环) java中的著名守护线程:gc(垃圾回收机制)
interrupt():中断当前线程阻塞状态
currentThread():得到当前正在运行的线程对象
可以出现在:主方法中,为了获得主线程对象
run方法中的其他的方法中,用来获取当前线程是谁
绝对不该直接出现在run()方法中,如果这样它返回的线程就是 this