黑马程序员_多线程

 ------- android培训java培训、期待与您交流! ----------


一、多线程 :一个进程在执行过程中可以产生多条线程,这些线程可以同时存在,同时执行多个不同的程序块,形成多个执行线索,达到对同一个线程内的共享内存单元的同时并发执行的高效率的编程手法。
二、创建多线程:
           1)继承Thread类,调用它的start()方法。
      2)定义类实现Runnable接口,将Runnable接口的子类对象作为实际参数传递给Thread类的构造函数,调用Thread类的start方法开启线程,并调用Runnable接口子类的run方法。
三、实现Runnble接口与继承Thread类的区别:
         1)、适合多个相同程序代码的线程去处理同一资源的情况,把虚拟CPU(线程)同程序的代码、数据有效分离,较好地体现了面向对象的设计思想。
         2)、可以避免由于Java的单继承特性带来的局限。开发中经常碰到这样一种情况,即:当要将已经继承了某一个类的子类放入多线程中,由于一个类不能同时有两个父类,所以不能用继承Thread类的方式,那么就只能采用实现Runnable接口的方式了。
        3)、增强了程序的健壮性,代码能够被多个线程共享,代码与数据是独立的。当多个线程的执行代码来自同一个类的实例时,即称它们共享相同的代码。多个线程可以操作相同的数据,与它们的代码无关。当共享访问相同的对象时,即共享相同的数据。当线程被构造时,需要的代码和数据通过一个对象作为构造函数实参传递进去,这个对象就是一个实现了Runnable接口的类的实例。
           所以,在定义线程的时候建议使用实现Runnable的方法。
四、线程中的常见的方法:
               public static Thread currentThread();返回当前正运行的线程对象;
                public final String getName();返回线程的名字;
               public void destroy();销毁线程;
               public void final join();等此线程结束后,在运行其他的线程;
                public void final run();里面封装了线程运行的时候要执行的代码;
                pulbic void final setName();设置线程的名称;
public static native void sleep(long millis);使线程休眠一定的时间片刻;
public void start();开启线程;
public static native void yield();临时中断线程,能保证CPU的平均分配;
五、1)多线程的安全隐患:
当多条语句在操作同一个线程中的共享数据时,一个线程对多条语句只执行了一部分,;还没执行完,另一个线程参与进来,导致共享数据的错误;
2)java的解决方式:同步代码块(synchronized)

synchronized(对象)
{
需要同步的代码 ;
}
通过把那些操作共享数据的多条语句放在同步代码块中,在同一时刻i,只能有一个获得锁的线程进入同步代码块中执行,在执行过程中,其它没有获得锁的线程,即使获取 了CPU的执行权,也不能进来,来解决多线程带来的安全隐患。
3)sychronized修饰函数同样可以实现同步的效果,他的锁是this(执行语句的当前对象);而同步函数被静态修饰,因为静态进内存时,内存中没有本类对象,而有该字节码对应的字节码文件对象,所以,此时,它的锁是方法所在类的字节码对象——类名.class。
六、1)死锁:一旦有多个进程,且它们都要争用对多个锁的独占访问,那么就有可能发生死锁。如果有一组进程或线程,其中每个都在等待一个只有其它进程或线程才可以执行的操作,那么就称它们被死锁了。
2)解决方式:
要避免死锁,应该确保在获取多个锁时,在所有的线程中都以相同的顺序获取锁。
七、线程之间的通信:多个线程在引用同一个实例各自运行不同的代码时,要达到实际的需求,往往需要对线程的运行状态进行调度,调用的方法:wait(),notify(),nitifyAll()。
八,线程停止的方法:1)把当前线程对象设置成空;2)为线程类设置一个布尔标志,定期检查该标志是否为真,如果想停止一个线程,就把该布尔值设置成空。3)run方法结束,控制住循环(停止线程提倡的方法)。
{
需要同步的代码 ;
}
通过把那些操作共享数据的多条语句放在同步代码块中,在同一时刻i,只能有一个获得锁的线程进入同步代码块中执行,在执行过程中,其它没有获得锁的线程,即使获取 了CPU的执行权,也不能进来,来解决多线程带来的安全隐患。
3)sychronized修饰函数同样可以实现同步的效果,他的锁是this(执行语句的当前对象);而同步函数被静态修饰,因为静态进内存时,内存中没有本类对象,而有该字节码对应的字节码文件对象,所以,此时,它的锁是方法所在类的字节码对象——类名.class。

 ------- android培训java培训、期待与您交流! ----------


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
黑马程序员多线程练习题主要包括两个问题。第一个问题是如何控制四个线程在打印log之前能够同时开始等待1秒钟。一种解决思路是在线程的run方法中调用parseLog方法,并使用Thread.sleep方法让线程等待1秒钟。另一种解决思路是使用线程池,将线程数量固定为4个,并将每个调用parseLog方法的语句封装为一个Runnable对象,然后提交到线程池中。这样可以实现一秒钟打印4行日志,4秒钟打印16条日志的需求。 第二个问题是如何修改代码,使得几个线程调用TestDo.doSome(key, value)方法时,如果传递进去的key相等(equals比较为true),则这几个线程应互斥排队输出结果。一种解决方法是使用synchronized关键字来实现线程的互斥排队输出。通过给TestDo.doSome方法添加synchronized关键字,可以确保同一时间只有一个线程能够执行该方法,从而实现线程的互斥输出。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [黑马程序员——多线程10:多线程相关练习](https://blog.csdn.net/axr1985lazy/article/details/48186039)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值