多线程

多线程

1. 多线程

   进程与线程

  什么是进程

  1.程序的指令和数据的集合,其本身没有任何的运行的含义,是一个静态的概念,

    进程是程序在CPU上的一次执行过程 它是一个动态的概念

  总结:进程具有一定独立功能的程序,是一个实体,在内存中每个进程都有自己的地址空间,互不影响

 进程状态【图】

  就绪   执行---堵塞

 cpu的调度运算【图】

  总结:进程是由cpu来分配资源的,同一时间只能调度员一个进程

  知道:电脑上打开过个程序变卡的原因。



什么是线程

  线程实际上是在进程的基础上的划分,一个进程启动后,里面的若干程序就会划分若干线程

  【我们的教室当做一个进程,我们每一个学生当做一个线程,所有的线程都在做项目

    每个学生写项目冲突么?  不冲突

    每个学生是不是属于某一个教室?  线程属于某一个进程

    每一个学生写项目的时候可不可以讨论?   可以

    其中教室的教师机大家都可以访问吗?  可以 进程的资源共享

    教室里真真做事的是谁?  学生【线程】

  】

  总结:线程是一个执行的路径,共享内存空间,线程之间可以互相切换,并发执行,一个进程至少需要一条线程

 

2. 线程的操作

  1.继承Thread类

  2.重写run()方法

public class Threads extends Thread{

         @Override

         publicvoid run() {

                   Threadt=Thread.currentThread();

                   for(inti=1;i<=10;i++){

                         System.out.println("当前线程编号"+t.getId()+"\t当前线程名"+t.getName()+"\t当前的线程状态"+t.isAlive()+"i="+i);

                   }

         }

}

3. 线程的操作方法二

 1.实现接口 runnable

 2.重写run()方法

public class Runnables implements Runnable {

         @Override

         publicvoid run() {

                   Threadt=Thread.currentThread();

                   for(intj=1;j<=10;j++){

                        System.out.println("当前线程编号"+t.getId()+"\t当前线程名"+t.getName()+"\t当前的线程状态"+t.isAlive()+"j="+j);

                   }

         }

}

4. 选哪种创建线程的方式好?

  接口好:因为选了接口本类还可以继承其他类,提高了程序的扩展性。

 

  其实Thread是线程    run是任务    第一种方式代表吧线程和任务变成一体

                             第二种方式将任务放入线程中等待cpu调度执行

 

5. 线程同步(线程安全)

  当多个线程共性一个数据的时候出现的问题

多线程中要进行资源共享,就需要同步,一旦同步过多,就会出现死锁。

 

  1.使用同步代码块

  使用synchronized(Obj){执行的方法}

  总结:锁住了当前的块    object对象就是锁   当前块获得了锁

  缺点:牺牲了性能换取了安全,出现死锁的现象【无法解锁】

  

  2.同步方法

  使用:publicsynchronized 修饰方法

  总结:锁住的是当前线程     创建当前的对象就是锁     当前创建的线程获得的锁

  缺点:牺牲了性能换取了安全,出现死锁的现象【无法解锁】

  

  3.Lock锁

  使用:创建锁对象ReentrantLock

 lock() 获得锁【上锁】

  nulovk()释放锁

  总结:上锁与解锁的时间由自己掌控,性能提高了

 

6.Thread类

 构造方法

 Thread(Runnable r)  分配一个新的线程对象

 Thread(Runnable r,String name)    分配一个新的线程对象,为当前线程取一个名字

 

  普通方法

 static Thread currentThread()  返回当前正在执行线程的对象的引用

 long getId();    返回当前线程的表示符【编号】

 String getName();  返回当前线程的名称

 boolean  isAlive()   测试当前线程是否处于活动状态

 static sleep(ms);  休眠指定的毫秒数后继续执行;

 setPriority(int i)  更改当前线程的优先级【只是更改抢占cpu的资源的几率】

               Thread.MAX_PRIORITY     10  设置当前线程可以具有最高优先级

               Thread.MINPRIORITY      1   设置当前线程可以具有最高优先级

               Thread.NORM_PRIORITY    5    设置当前线程可以具有最高优先级

               也可以设置 1-10之间的值

 interrupt(); 中断线程

 setDaemon(boolean b)  设置当前的线程是否为守护线程【守护那些 非守护的线程都执行完  自己停止执行】

 static yieId()    放弃当前抢占的cup资源   并执行其他线程

 

 join()  等待该线程的终止

 join(ms) 等待该线程最终执行时间的最大毫秒数     超出时间不在等待

wait()休眠等待,会让出所占用的CPU,并解锁

notify()唤醒休眠进程



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值