线程Thread

1、定义、实例化线程

两种方法:

1)、扩展java.lang.Thread

public class MyThread extends Thread{

        public void run(){...}
/**
 *可以在Thread子类中自由的重载run方法,但只有调用重载的run(String  s)方法,否则没有人调用它,它 
 *不会被用作新调用栈的基础。
 */

        public static void main(String[] args){
            MyThread a = new MyThread();
            a.start();
        }
}

2)、设计Runnable接口

public class MyThread implements Runnable{

    public void run(){...}
    public static void main(String[] args){
        MyThread a = new MyThread();
        Thread t1 = new Thread(a); //Runnable 成为线程的目标
        Thread t2 = new Thread(a); //多线程
        Thread t3 = new Thread(a);
        t1.start();
        t2.start();
        t3.start();
    }

}

Thead 类的其他构造函数

Thread();
Thread(Runnable target);
Thread(Runnable target,String name);
Thread(String name);
Thread(ThreadGroup group,Runnable target);
Thread(ThreadGroup group,String name);
Thread(ThreadGroup group,Runnable target,String name);

通过Thread.CurrentThread()可以得到对当前执行线程的引用。

2)、Thread中的两个方法start和run

start():启动新线程,该线程从新状态到可运行状态,run方法。

run():可以被调用,也可以start()启用

一旦线程结束(run()结束)他就不能再被启动。若再调用start()产生运行时异常。

3)、线程调度程序:

//1. java.lang.Thread
public static void sleep(long mills) throws InterruptedException //重载
public static void yield();
public final void join(); //重载
public final setPriority(int newPriority);
//2.java.lang.Object
public final void wait();
public final void notify();
public final void notifyAll();

2、阻止线程执行

关心的问题:

1)、睡眠:在代码中使用它强制当前线程在回到可运行状态之前进入睡眠状态。

try-catch

无保障:当前线程醒来的时候,他只能回到可运行状态。

2)、等待

优先级:最高优先级抢占、同优先级时间片,或选一个运行完毕、阻塞、

无保障-----默认5级------min(1)------NORM(5)------max(10)

让步:让当前的运行线程回到可运行状态,以允许具有相同优先级的其他线程获得运行机会。

无保障 回到可运行状态还会被选中。

join方法:t.join[mian()中]

保证离开线程:

sleep 保证

yield 无保证

join 保证

run 完成 保证离开

wait 保证

线程不能在对象上获得锁定,而试图运行该线程的方法

3)、因为需要一个对象的锁定而被等待。

3、同步代码

怎样保护数据:把变量标记为private,同步那些修改变量的方法

  • 只能同步方法,不能同步变量
  • 每个对象只有一个锁
  • 类可有同步和非同步方法
  • 一旦线程获得对象上的锁,则任何其他线程都不能进入该类的同步方法,但可访问非同步方法。
  • 如果线程睡眠,则它带着锁。
  • 线程可以获得多个锁,也可以调用统一对象上的多个同步方法。
  • 同步方法和代码块时,要获得对象的锁。
  • 死锁=程序死掉

4、线程交互

Object 中的wait(),notify(),notifyAll()

必须在同步环境内调用wait(),notify(),notifyAll()

线程不能调用对象上的等待或通知方法除非它拥有那个对象。

如果调用wait的方法不拥有该锁抛出非检查异常,b.wait()时将释放锁。

  • wait(),notify(),notifyAll()属于 object
  • start(),yield(),sleep()、join()属于Thread
  • run() 属于 Runnable

如果没有中断,无论什么时候通知他或超过指定的时限时,都将继承。退出等待状态。

synchronized(a){

        a.wait(2000);//thread release the lock and waits for notify
                     //but for 2 seconds,then goes bank to Runnable
                     //thread reacquires the lock

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值