线程相关

1.多线程每个线程的时间片都是随机的,也就是说当前线程随时都有可能被其他线程抢占资源,线程的调用次序是随机的

public class Thread0 implements Runnable {

    int m = 100;//注意Mwhile里面的情况,放在外面相当于两个窗口卖100张票

    public void run() {

       //int m = 100;  局部变量,每个线程都共享这个变量 ,相当于每个窗口卖100张票

       while (true) {

           if (m > 0) {

              m--;

              System.out.println(m);

           } else {

              break;

           }

       }

    }

}

2.Thread.sleep(100)暂停某个线程,主要用于防止某个线程一直占用资源。核心是释放资源,因为只有一个cpu,多线程是抢占式的。Sleep只能对自己其作用,只能让自己睡觉,不能调用别的线程的sleep方法,也不能让别人睡觉;sleep可能会抛出InterruptedException异常。Thread.sleep()能够实现交替输出,但只是一个粗略的交替输出,比如,有3个线程的话,只能保证每一段是3个不同的线程,但不能保证每段的线程顺序一样。例如3个线程的结果:

Thread-2

Thread-1

Thread-0

Thread-1

Thread-0

Thread-2

Thread-0

Thread-2

Thread-1

3.同步synchronized(this){},相当于一把锁,使得线程不能交替运行,一次运行完一个线程。但synchronized()会降低系统的性能。实现的两种方式,用法例子:

    // 方式一

       public void run() {

       //int m = 100;  局部变量,每个线程都共享这个变量

       synchronized(this){  

       while (true) {

           if (m > 0) {

              /*try {

                  Thread.sleep(100);

              } catch (InterruptedException e) {

                  // TODO Auto-generated catch block

                  e.printStackTrace();

              }*/

              m--;

              System.out.println(m);

           } else {

              break;

           }

 

         }

       }

    }

 

方式二:

public synchronized void run() { 

       //int m = 100;  局部变量,每个线程都共享这个变量

      

       synchronized(this){

       while (true) {

           if (m > 0) {

              /*try {

                  Thread.sleep(100);

              } catch (InterruptedException e) {

                  // TODO Auto-generated catch block

                  e.printStackTrace();

              }*/

              m--;

              System.out.println(m);

           } else {

              break;

           }

 

         }

       }

    }

 

4.main方法外直接用this调用方法,this是非静态变量,不能直接调用方法,必须先new一个实例。

//  this.run();                  //error

    //run();                    //error

    { this.run();}    //相当于一个匿名方法,在产生实例前就存在

    /*private String UserName;

    public void setUserName(String name){

       UserName = name; //默认是 this.UserName,但如果UserName的标识符和局部变量一样,则会出错

    }*/

 

5.Thread.join();Thread.yield();

wait():可以释放锁,可以调用别的Threadwait方法,和notify成对出现

notify():通知wait()不用再等待了

//异步asynchronized 线程同时运行   同步synchronized  同时只能一个线程

 

6. extends Tread implements Runnable 的区别

只是Thread只能是继承,而Runnable是接口。Java只支持单继承,所以你的类如果还要继承自其它的类,就不能用Thread了,这时可以用runnalbe接口。  ThreadRunnable的实现类。如果你想对它做一些Thread对象才能做的事情(比方说toString(   )里面的getName(   )),你就必须用Thread.currentThread(   )去获取其当前线程。Runnable   interface的好处在于,所有东西都属于同一个类;也就是说Runnable能让你创建基类和其它接口的mixin(混合类)

 

7. sleep() wait()的区别

sleep 是线程类(Thread)的方法,导致此线程暂停执行指定时间,把执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep 不会释放对象锁。

wait Object 类的方法,对此对象调用wait 方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify 方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。

还有用法的上的不同是:sleep(milliseconds)可以用时间指定来使他自动醒过来,如果时间不到你只能调用interreput()来强行打断;wait()可以用notify()直接唤起.

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值