Chap 07: 多线程

     进程之间不共享数据,即使是同类进程之间(如两个记事本之间)

     线程则是实现单一功能的一个指令序列,一个程序中可以包含多个线程。

     线程的生命周期: 创建,可运行,运行,不可运行,死亡。

     java中的线程类: ThreadRunnable接口。

     Thread类: 是支持多线程机制的一个重要的类,提供了很多关于线程调度(启动,休眠,运行等)的方法。

     线程的优先级: MIN_PRIORITY(0), MAX_PRIORITY(10), NORM_PRIORITY(5).

     Static void yield()让当前线程暂时退出,让其他等待线程得到调度。Void join()等待线程死亡。

     设计一个线程类时,通常时继承thread类,并重写他的run方法,然后通过调用start()方法来自动激活run(),执行线程。

     sleep()方法会发出一个系统定义的中断异常,改语句放在try块中,随后由catch语句捕获并处理。实现当前线程休眠一段时间。线程休眠也就是线程进入不可运行状态,当休眠时间一到,线程进入可运行状态,等待被调度运行。

     runnable接口主要时用来实现多继承的。Runnable中只有一个方法run(),实现了runnable的类必须实现run()方法,然后由调用线程的start()方法来自动激活run()方法。

     要在一个类中使用另一个类的方法可以有两种设计方法: 一是继承,而是使类对象成为类成员。在实现了runnable的类中就必须定义一个thread的类对象,然后调用他的start方法来激活run()方法。

     线程状态: new thread()创建一个线程,则处于创建状态,是一个空的线程对象,只有当改线程调用了start()方法后,线程就处于可运行状态。处于可允许状态的线程等待操作系统的线程调度程序调度。处于运行状态的线程将首先调用run()。线程由于调用了sleep(),wait(),或者I/O发生了线程阻塞使得线程进入阻塞状态,此时即使cup空闲,也不执行线程。当线程run方法执行完或者应用程序结束,则线程就死亡。  

     线程分组: 每个线程都属于唯一的永久的一个线程组,线程组可以用来统一管理该组中所有的线程,如线程的启动,运行等。当创建线程的时候,如果制定线程组,则系统把他放入默认的线程组main中。

     一段经典的代码: forchar c=’a’;c<=’d’;c++…..

     共享资源的互斥:即使多个线程对同一个资源的操作,必须保证一个以线程操作完成之后才可以让另一个线程来操作。用synchronized来实现。  Synchronized就是给共享资源加互斥锁的。Synchronized锁住的都是对象(可以使对象本身,可以是对象的方法),意识说在synchonrized 修饰的区域执行期间,共享资源是被锁住的,其他线程如果要操作共享资源则必须等该synchonrized 锁住的范围执行完之后。换言之: synchronized锁住的区域是原子操作,不可以中断。

     线程间的同步: 一个线程的运行要依赖另一个线程对共享资源的处理结果。要保证线程之间的同步,设计方法是: 出了互斥锁外,还要在并行运行的线程上加信号量。信号量是标记一种操作是否已经执行完毕,另一种操作是否可以执行了。Object中提供了wait()和notify()等方法用来保证线程同步。Wati()让一个线程转入阻塞状态,notify()把线程从阻塞状态转入可运行状态。Wait()方法所在的代码段一定要加synchronized。因为wait()方法在把当前的线程从运行状态转为阻塞状态后,还要释放互斥锁锁定的共享资源,否则其他同步线程无法执行。这样的操作是原子的,不允许被中断。

sleep()和wait()的区别: 在调用了sleep()期间,即使该段代码用来synchronized也不会释放共享资源,而wait()则要释放共享资源。                
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值