黑马程序员——JAVA 线程

来源:互联网 发布:rayban眼镜 知乎 编辑:程序博客网 时间:2024/06/01 08:58
------- android培训、java培训、期待与您交流! ----------

线程

    进程是一个正在执行的程序,每一个进程执行都有一个执行顺序,该顺序是一个执行路径,或者叫一个控制单元。而线程就是一个独立的控制单元,控制着进程的执行。并且一个进程中至少有一个线程。

  Java VM 启动的时候会有一个进程Java.exe,该进程中至少一个线程负责Java程序的执行,而且这个线程运行的代码存在于main方法中,该线程称为主线程。另外,更细节说明jvm,jvm启动不止一个线程,还有负责垃圾回收机制的线程。


如何在自定义的代码中,自定义一个线程呢?

  一、 通过对API的查找。java已经提供了对线程这类事物的描述,就Thread类来说步骤如下:

  1,定义类继承Thread。2、复写Thread类中的run方法以便将自定义代码存储在run方法,让线程运行。3、调用线程的start方法,该方法作用有两个,一是启动线程,再就是调用run方法。


     多线程运行时运行结果每次都不同,因为多个线程都获取cpu的执行权,cup执行到谁,谁就运行。明确一点,在某个时刻,只能有一个程序在运行(多核除外),而是cup在做的快速的切换,已达到看上去是同时运行的效果。我们可以形象的把多线程的运行指定为在互相抢夺cpu的执行权。就也是多线程的一个特性:随机性。谁抢到谁执行,至于执行多长时间,cup说的算。


   线程都有自己默认的名称,例如Thread—编号,该编号从0开始。static Thread currentThread();获取当前线程对象。getName();获取线程名称。设置线程名称用setName或者构造函数。


二,建立线程的第二种方式:实现Runable 接口

步骤:

  定义类实现Runnable 接口;覆盖Runnable接口中的run方法;将线程要运行的代码存放在该run方法中。

通过Thread类建立线程对象。

    将Runnable接口的子类对象作为实际参数传递给Thread类的构造函数。因为,自定义的run方法所属的对象是Runnable接口的子类对象。所以要让线程去定义指定对象的run方法,就必须明确该run方法所属对象。


实现方式和继承方式有什么区别呢?

   实现方式好处:避免了单继承的局限性。在定义线程时,建议使用实现方式。区别在于,继承Thread:线程代码存放Thread子类run方法中。实现Runnable,线程代码存在接口的子类的run方法中。


多线程运行的安全问题

   例如当多条语句在操作同一个线程共享数据时,一个线程对多条语句只执行一部分,还没有执行完,另一个线程就参与进来执行,这样就会导致共享数据的错误。

解决办法

   对多条操作共享数据的语句,只能让一个线程都执行完。在执行过程中,其它线程不可以参与执行。

java对于多线程的安全问题提供了专业的解决方式——就是同步代码块。

synchronized(对象)

{

需要被同步的代码;

}

其中对象如同锁。持有锁的线程可以在同步中执行,没有锁的线程即使获取cpu的执行权,也进不去,因为没有获取锁。同时同步必须有前提。1、必须要有两个或者两个以上的线程。2、必须是多个线程使用同一个锁。同步既有利也有弊,好处是解决了多线程的安全问题,弊端是多个线程需要判断锁,较为消耗资源。


    当运用同步时如何明确自己用的是否正确呢,先是明确那些代码是多线程运行代码,明确共享数据,最后明确多线程运行代码中那些语句是操作共享数据的。

 

   同步函数用的锁是this,因为函数需要被对象调用,那么函数都有一个所属对象引用,就是this。如果同步函数被静态修饰后,因为静态方法中不可以定义this,所以锁就不再是this。静态进内存事,内存中没有本类对象,但是一定有该类对应的字节码文件对象。类名.class  该对象的类型是Class。所以静态同步中使用的锁是该方法所在类的字节码文件对像——类名.class。

  对于懒汉式的同步处理



对线程中锁的线程操作

  wait  notify()   notifyAll()  这三者都使用在同步中,因为要对持有监视器(锁)的线程操作,所以要使用在同步中,因为只有同步才具有锁。

   这些操作线程的方法要定义在Object类中,因为这些方法在操作同步中线程时,都必须要标识要标识它们所操作线程只有的锁,只有同一个锁上的被等待线程,可以被同一个锁上notify唤醒,不可以对不同锁中的线程进行唤醒,也就是说,等待和唤醒是同一个锁,而锁可以是任意对象,所以可以被任意对象调用的方法定义object类中。


  JDK1.5中提供了多线程升级解决方案,将同步synchronized替换成现实Lock操作,将object中的wait,notify,notifyAll,替换成了Condition对象。该对象可以Lock锁,进行获取,该示例中,实现了本方只唤醒对方操作。


 如何停止线程?

 stop方法已经过时,只有一种,run 方法结束,开启多线程运行,运行代码通常是循环结构,只要控制住循环,就可以让run方法结束,也就是线程结束。特殊情况:当线程处于冻结状态,就不会读取到标记,那么线程就不会结束。当没有指定的方式让冻结的线程恢复到运行状态时,这时需要对冻结进行清除,强制让线程恢复到运行状态中来,这样就可以操作标记让线程结束。Thread类提供该方法 interrupt();

-------- android培训、java培训、期待与您交流! ----------
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 手机号被别人注册了百度账号怎么办 快手被盗找回时出来重置密码怎么办 魅族账号密码和密保都忘记了怎么办 vivo账号的密保问题忘了怎么办 oppo账号密保问题忘了怎么办 小米手机刷了机忘了账号密码怎么办 忘了小米账号的密码是多少怎么办 千牛账号在手机上被限制登录怎么办 违规的千牛账号被限制登录了怎么办 苹果id和锁屏密码忘记了怎么办 感应门的编程密码忘记了怎么办 交易猫买的号被找回了怎么办 uc上我的小说看不了怎么办 微信零钱忘记密码没有银行卡怎么办 九游平台冻结提不了现怎么办 计算机考试报名登录名忘记了怎么办 云顶扑克提现怎么提不出来怎么办 微信正在下载一直0kb怎么办 守望先锋运行时出现意外错误怎么办 信用卡暂停使用怎么办还能恢复吗 新刷乳胶漆墙面一碰一个坑怎么办 夏天开空调冻着了头疼打喷嚏怎么办 桑蚕丝衣服被沐浴露退了色怎么办 空间被别人知道了密码登录了怎么办 三星手机显示解析包出现问题怎么办 三星手机下载解析包出现问题怎么办 两万的流动大棚给整坏了怎么办 劲舞团抽奖领了一样的衣服怎么办 win系统ps界面字体太小怎么办 任何网页都变成监控登录界面怎么办 微信启动录音的尝试被拒绝怎么办 微信传到电脑的文件打不开怎么办 转转网账号出租时遇到防沉迷怎么办 如果买了王者号结果有防沉迷怎么办 苹果手机一直显示验证失败怎么办呢 安装包证书异常导致安装失败怎么办 qq飞车忘了几区的怎么办 5e在游戏里卡住不动怎么办 别人发的cdr文件打开太慢怎么办 qq红包充值话费未到账怎么办 qq飞车充值至尊皇冠不到账怎么办