多线程

这几天忙了一些私事,真让人感叹,有时现实真是残酷!我恨透了传销,他日我若有钱,必将捐赠反传销事业!好了,不多说了,转入正题,本来是分四部分学习的,各部分内容有点少,就一次全贴出来了!

进程:在一个时间段内只能做一件事情。
线程:在进程的基础上划分,之后在同一个时间段内可以比传统进程完成的功能更多。

例:张三在公司上班,做打字员,打字一个工作,==进程
    张三业务扩展,又做程序开发人员,兼顾卫生管理员,多个事情==线程
CPU只有一个(张三只有一个),是指在同一时间段内可以完成多个程序(工作),但在同一时间点,只能有一个程序工作(张三只能做一种事情,打字、开发或者打扫)。

多线程的优势:
  1.减轻编写交互频繁、涉及面多的程序的困难。
  2.程序的吞吐量会得到改善。
  3.有多个处理器的系统,可以并发执行不同的线程(否则,任何时候只有一个线程在运行)。

线程实现:
  1.继承Thread类
  2.实现Runnable接口
需要重写run()方法,线程启动使用start()方法。

使用继承Thread类实现多线程不爽,因为Java中不支持多重继承,若这个类继承了Thread,便无法在继承其他的类。
解决途径:使用Runnable接口实现多线程。他比继承Thread类有好处:
 1.适合多个相干同程序代码去处理统一资源的情况
 2.可以避免由于Java单继承特性带来的局限
 3.有利于程序的健壮性,代码能够被多个线程共享

Runnable接口中只有一个run()方法,那么在线程启动时需要通过Thread类实现启动方法。
Thread(Runnable target)
          分配新的 Thread 对象。
小结:
1.Thread类其实也是实现了Runnable接口。
2.继承Threa多个线程之间不能实现资源的共享,而实现了Runnable接口之后可以实现多个线程之间的资源共享。
3.用继承Thread的线程,一个线程序对象只能启动一次,无论调用多少遍start()方法,结果都只有一
个线程。

所有的线程操作就是指Thread类的操作。
static Thread currentThread()
          返回对当前正在执行的线程对象的引用。
String getName()
          返回该线程的名称。
void setName(String name)
          改变线程名称,使之与参数 name 相同。
int getPriority()
          返回线程的优先级。
void setPriority(int newPriority)
          更改线程的优先级。
 boolean isAlive()
          测试线程是否处于活动状态。 
 void join()
          等待该线程终止。 (此线程终止后,才能运行其他线程)
 static void sleep(long millis)
          在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响。

void interrupt()
          中断其他线程。
static boolean interrupted()
          测试当前线程是否已经中断。 
static boolean interrupted()
          测试当前线程是否已经中断。

同步问题:资源协调

用synchronized来标识的区域或方法即为监视器监视的部分。
一个类或一个对象有一个监视器,如果一个程序中有两个方法使用syschronized标识,则他们在一个监视器管理之下。
在Java中使用synchronized关键字进行同步:
 synchronized(对象)
   {
     同步代码
   }

代码块:四种
 1.普通代码块 (直接写在方法之中的)
 2.构造块     (直接写在类中的)构造块优先构造方法执行。
 3.静态块     (使用static关键字括起来的代码块)静态块优先构造块执行,而且仅执行一次。
 4.同步代码块 (使用synchronized关键字括起来的代码块)需要一个同步对象。应该是对当前操作的线程同步,所以此操作应该使用this,为this进行同步。

小结:多线程的同步问题
      ·在多个线程操作同一个资源的时候产生的问题
      ·同步可以通过两种方式来实现:
          ·同步方法
          ·同步代码块
同步会产生一个问题-----死锁
 死锁就是在多线程编程中由于处理不当而造成程序停止运行的一种状态。
 一般而言是在程序中发生的一种状态,大家只需要了解其产生的根本原因即可。
经典案例:生产者和消费者问题
线程间通信
 ●一个线程向数据存储空间添加数据(生产者),另一个线程从存储空间取出数据(消费者)
 ●这个程序有两种意外需要考虑:
     ·假设生产者线程刚向数据存储空间添加一个人的姓名,还没有加入这个人的性别,CPU就切换到        了消费者线程,消费者线程将把这个人的姓名和上一个人的性别联系在一起。
     ·生产者放了若干次数据,消费者才开始取数据,或者是,消费者取完一个数据后,还没等到生         产者放入新的数据,又重复取出已经取过的数据。
   可能出现的问题:
     1.生产者比消费者快时,消费者会漏掉一些数据没有取到。
     2.消费者比生产者快时,消费者取相同的数据。

public final void wait()   throws InterruptedException
          在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,导致当前线程等待。
public final void notify()  
          唤醒在此对象监视器上等待的单个线程。
public final void notifyAll()
          唤醒在此对象监视器上等待的所有线程。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值