一.进程和线程
对每个线程,栈空间是独立的,栈先进后出不独立很容易出现错误。堆空间就是共享的。
举个例子,盖楼房。一个一个的工人就是线程,改的楼就是进程。
进程相互之间独立,资源不会共享,盖这个楼的砖就是这个楼的。会一直动,一直盖楼。多个进程可以在单个处理器同时进行,互不影响。
线程:是完成进程的一个个小的组成部分,没有线程进程就是个空架子没有意义。线程是抢占式的,谁抢上cpu谁就早早干活。进程不能共享资源,工人可以偶尔帮忙。系统创建进程需要为该进程重新分配资源,而创建线程则容易,所以使用线程完成多个进程。
二.多线程的实现
多线程的三种创建方式
1.继承Thread类:所有线程类的父类,启动线程使用start();
2.实现Runnable接口
3.实现Callable接口
模拟卖票代码
public class ThreadTextDemo01 {
public static void main(String[] args) {
//需求:模拟4个售票员各售100张票
SellTickets w1 = new SellTickets();
SellTickets w2 = new SellTickets();
SellTickets w3 = new SellTickets();
SellTickets w4 = new SellTickets();
w1.start();
w2.start();
w3.start();
w4.start();
}
}
class SellTickets extends Thread {
//数据
int ticket = 100;
@Override
public void run() {
//循环售票
while(true) {
if(ticket<1){
break;
}
System.out.println(Thread.currentThread().getName() + "售出了第"+ticket+"张票");
ticket--;
}
}
}
实现Runnable接口
1.需要重写接口里面的run方法 ,Thread对象才是真正的线程对象。
public class TicketRes implements Runnable{
int ticket = 100;
@Override
public void run() {
while(true) {
if(ticket<1){
break;
}
System.out.println(Thread.currentThread().getName() + "售出了第"+ticket+"张票");
ticket--;
}
}
}
public class ThreadTextDemo02 {
public static void main(String[] args) {
// 票
TicketRes res=new TicketRes();
//线程对象
Thread t0 = new Thread(res);
Thread t1 = new Thread(res);
Thread t2 = new Thread(res);
Thread t3 = new Thread(res);
t0.start();
t1.start();
t2.start();
t3.start();
}
}
现在这是单纯的使用Runnable接口,下一篇可以使用锁进行优化。
Thread与Runnable两者的优缺点:
1.Thread继承了Thread,不能再继承其他的了。但是编写很简单。
2.Runnable接口可以共享一个资源,所以适合多个线程处理同一个资源。有好多资源使用runnable接口就需要提取出来,不好的是编写很复杂不直观,获取的时候需要使用Thread.currentThread();
start与run方法的区别:start创建一个新的线程然后运行run里面的方法,调用run就直接运行并不会创建一个新的线程。
线程中使用的一些方法
1.休眠 sleep Thread.sleep(休眠时间毫秒)
2.设置线程优先级 p1.setPriority() 优先级的顺序是1-10.优先级的大小只会影响出现的概率。
3.合并和加入线程 优先执行合并后的线程,执行完合并的线程后,再回到原来的工作的任务中,继续执行原来的线程。jointhread
4.后台线程:deamonThread
5.线程让步:YieldThread t0=new YieldThread("线程") 线程让步,不会让线程进入阻塞状态
6.线程中断:等待过程中,可以使用interrupt方法打断。
四.线程的生命周期
state枚举表示线程的状态:NEW(新生),RUNNABLE(可运行),BLOCKED(锁阻塞),WAITING(等待),TIMED_WAITING(限时等待),TERMINATED(终止死亡)。
总结
1.多线程的创建:继承Thread,重写run方法。实现runnable接口。实现callable接口,有返回值抛出异常。