Java线程

一、如何启动新的线程

1.建立Runable对象(线程的任务)

Runnable threadJob = new Runnable()
{
    @Override
    public void run()
    {
        // TODO 线程任务
    }
};

2.建立Thread对象(执行工人)并赋值Runnable(任务)

Thread myThread = new Thread(threadJob);

3.启动线程

myThread.start();

二、线程调度器

线程调度器会决定哪个线程从等待状态中被挑出来运行,以及何时把哪个线程送回等待被执行状态。它会决定某个线程要运行多久,当线程被踢出时,调度器也会指定线程要回去等待下一个机会或者是暂时地堵塞。你无法控制调度,没有API可以调用调度器。最重要的是,调度无法确定。而且你不能假设每个程序都会被调度分配到公正平均的时间和顺序。

三、与线程相关的一些关键字

1、synchronized

使用synchronized来修饰方法使他每次只能被单一线程存取,例如

public synchronized void takeMoney()
    {
        // 取钱
    }

synchronized关键词代表线程需要一把钥匙来存取被同步化(synchronized)过的线程,要保护数据,就把作用在数据上的方法给同步化。

2、join

在某一线程里面调用另一线程的join方法时,表示将本线程阻塞直至另一线程终止时再执行。

例如在主线程中

void main()
    {
        Thread A;
        A.start();
        A.join();
    }

这样主线程就必须在A线程终止时才能继续运行。

3、wai()和notify()机制

通常,多线程之间需要协调工作。例如,浏览器的一个显示图片的线程displayThread想要执行显示图片的任务,必须等待下载线程downloadThread将该图片下载完毕,如果图片还没有下载完,displayThread可以暂停,当downloadThread执行完成任务后,再通知displayThread执行。

以上逻辑简单的说就是:如果条件不满足,则等待。当条件满足时,等待该条件的线程将被唤醒,在java中,这个机制的实现依赖于wait/notify。等待机制与锁机制是密切相关的。例如:

synchronized(obj)

{

while(condition)
{
        obj.wait();
  }

obj.doSomething();

}

当线程获得obj锁后,发现条件condition不满足,于是线程A就wait。

在另一线程B中,如果B更改了某些条件,使得线程A的condition条件满足了,就可以唤醒线程A:

synchronized(obj)

{

condition = true;

obj.notify();

}

注意:

①、调用obj的wait(),notify方法前,必须获得obj锁,也就是必须写在synchronized(obj){}代码段内

②、调用obj.wait()后,线程A就释放了obj的锁

③、当obj.wait()方法返回后,线程A需要再次获得obj锁,才能继续运行。

④、如果A1、A2、A3都在obj.wait(),则B调用obj.notify()只能唤醒A1、A2、A3中的一个(具体哪一个由JVM决定)。

⑤、obj.notifyAll()则能全部唤醒A1、A2、A3,但要继续执行obj.wait()下一条语句,必须获得obj锁,因此A1、A2、A3只有一个有机会获得锁继续执行,例如A1,其余的需要等待A1释放obj锁后才能继续执行。

⑥、当B调用obj.notifyAll()的时候,B正持有obj锁,因此A1、A2、A3随被唤醒,但是仍然无法获得obj锁。知道B退出synchronized块,释放obj锁后,A1、A2、A3中的一个才有机会执行。

参考资料:

http://www.cnblogs.com/xzp/archive/2008/01/11/1034601.html

http://dszhang.blog.163.com/blog/static/1228125742011013111925194/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值