线程

一.进程和线程

 对每个线程,栈空间是独立的,栈先进后出不独立很容易出现错误。堆空间就是共享的。  

举个例子,盖楼房。一个一个的工人就是线程,改的楼就是进程。  

进程相互之间独立,资源不会共享,盖这个楼的砖就是这个楼的。会一直动,一直盖楼。多个进程可以在单个处理器同时进行,互不影响。

线程:是完成进程的一个个小的组成部分,没有线程进程就是个空架子没有意义。线程是抢占式的,谁抢上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接口,有返回值抛出异常。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值