Java多线程

线程的简单介绍:

关于线程对于初学者来说应该是一个难点,就是有种听着名字,就不想学的感觉,但其实线程没有想象中的那么难学,只是专有名词有点难理解而已

首先来看看进程与线程的区别:

进程:已经在运行的应用程序叫做一个进程,计算机可以同时运行多个进程。

线程:比进程更小的一个单位,是指在进程的内部的每一个执行单元(单独的),一个进程中可以含有多个线程,操作系统给每个线程分配不同的时间片,而cpu仅仅执行一个时间片,多个线程的时间片在不停地轮换着,(这就涉及到了线程的优先级,优先级越高的线程,可以获得cpu的资源更多)。

了解了进程与线程的区别后,再来看看创建线程的方法:

创建线程主要有俩种方法

1.      创建Thread子类的来重写run方法

2.      实现Runtime接口

使用继承Thread()来创建线程类

主要的构造方法有:Thread()、Thread(Runnable target)(这个是利用Runnable接口实例创建一个线程),Thread(Runnabletarget,String name),基于Runnable、接口创建线程并且给线程起个名字,Thread(String name),基于给定名称创建一个线程对象

例:Public class thread1 extends Thread{}

使用实现Runnable接口来创建线程类

Public class thread2 implements Runnable{}

//这只是创建了一个线程实现类

Thread  thread = newThread(thread2)

//这才真正创建了一个线程类


线程的生命周期:
五个状态:

1.      新建状态:线程对象刚刚被new出来,还没有执行strat()方法。

2.      可执行状态:线程对象执行了strat方法后,还没有获取到cpu资源,处于等待的一种状态

3.      运行状态:线程对象获得了cpu资源,开始了运行

4.      阻塞状态:正在运行中的线程对象,由于受到其他的因素而中断了运行,变成了阻塞状态;当导致阻塞的原因消失后,阻塞状态又会回到运行状态。(和可执行状态类似)

5.      死亡状态:线程的任务运行完成之后,进入的状态。



注意:并发问题就是来自于多线程,几个线程同时执行,只有优先级能限制其占领资源的多少,但是也不能决定谁先进行谁后进行线程的启动,这个不可预料的。


线程类的几个方法

1.      run方法:包括线程运行是的业务逻辑代码,也就是说只有写在这里面的线程才可以成为多线程中的一个,在这个方法之外的代码不会存在于业务逻辑中

2.      start方法:线程的运行是要通过这个方法来运行,在运行一个新的线程时要调用此方法,之后java虚拟机会自动调用run方法。

(注意不能直接用。run()来开启一个线程,这样虚拟机会将run()方法当做一个普通的方法执行)

3.      sleep()

这个方法是属于Thread类的,调用时线程类会处于休眠状态,参数是毫秒,等到sleep超时时,线程会自动进入可执行状态,等待cpu资源。

4.      join()

再某一个正在执行的线程中调用这个方法时,该线程会自动挂起,调用join方法调用的线程,等那个线程执行完毕之后,该线程会自动浸入可执行状态,等待cpu资源。

5.      yield()

此方法作用在正在运行的线程中,让此线程从新回到可执行状态,重新抢夺cpu资源。

6.      isAlive()

可以判断线程是否死亡。

注意:一个正在运行的线程,不能再调用它的start方法。

 

线程的优先级

对线程的调度的实现有俩种方式

1.      分时调度模型:让所有的线程轮流获得cpu的控制权,请为每一个线程平均分配cpu的时间片段。

2.      抢占式的调度模型:若优先级高的获得资源多,若优先级全部相同的话,所有线程都随机执行。

 

Thread类(注意是Thread类,Runnable不行)有俩种关于线程优先级的方法

1.      setPriority()设置线程优先级

2.      getPriority()获取线程的优先级

线程优先级有十种,main方法的默认优先级为5

3.      Thread类定义了三种表示线程优先级的常量

MAX_PRIORITY:代表最高级

MIN_PRIORITY:代表最低级

NORM_PRIORITY:代表正常优先级5级别;

但是由于java的跨平台性,导致优先级不一定适用所有的操作系统,所以一般不常用

 线程的同步问题:

首先得理解为什么会有线程的同步出现,线程的同步是要解决那个问题,怎么样实现线程同步?

线程的同步是为了解决多线程并发的问题的,因为Java中的线程调度实现方式是抢占式的,所以导致了多线程的程序中一个的线程在运行时,可能会被另一个线层强占掉cpu资源而导致数据不安全。

实现线程同步的方式有俩种,但是俩种都使用同一个关键词synchronized

第一种式同步方法,在方法上加上synchronized

例:

public synchronized void say(){}

此时当多线程程序访问此公共方法时,此方法一次只允许一个线程进入,等到这个线程执行完毕之后,下一个线程才能访问此方法,这样就保证了线程不会发生并发问题。

第二种实现方法是:同步代码块

例:

public void say(){

    synchronized{

        //需要同步的代码

    }

}

这俩种方法实现同步的效果都是一样的,区别在于同步代码块的性能比同步方法的性能要高一点,因为对于这种同步来说范围越小性能越高。

线程同步的优缺点

线程同步的优缺点其实很明确,同步可以解决多线程并发的问题,保证了数据的安全性。同时线程同步也降低了cpu的使用率,降低了运行效率。

当然线层同步后也会带来一些问题比如说:

线程之间的通信以及死锁等,这个下一篇在研究。








  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
信息数据从传统到当代,是一直在变革当中,突如其来的互联网让传统的信息管理看到了革命性的曙光,因为传统信息管理从时效性,还是安全性,还是可操作性等各个方面来讲,遇到了互联网时代才发现能补上自古以来的短板,有效的提升管理的效率和业务水平。传统的管理模式,时间越久管理的内容越多,也需要更多的人来对数据进行整理,并且数据的汇总查询方面效率也是极其的低下,并且数据安全方面永远不会保证安全性能。结合数据内容管理的种种缺点,在互联网时代都可以得到有效的补充。结合先进的互联网技术,开发符合需求的软件,让数据内容管理不管是从录入的及时性,查看的及时性还是汇总分析的及时性,都能让正确率达到最高,管理更加的科学和便捷。本次开发的医院后台管理系统实现了病房管理、病例管理、处方管理、字典管理、公告信息管理、患者管理、药品管理、医生管理、预约医生管理、住院管理、管理员管理等功能。系统用到了关系型数据库中王者MySql作为系统的数据库,有效的对数据进行安全的存储,有效的备份,对数据可靠性方面得到了保证。并且程序也具备程序需求的所有功能,使得操作性还是安全性都大大提高,让医院后台管理系统更能从理念走到现实,确确实实的让人们提升信息处理效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值