多线程Thread

15 篇文章 0 订阅

·线程是进程中的不同执行路径,进程消失,线程也跟着消失。

 

·线程存在:创建、就绪、运行、阻塞和死亡状态。

 

·一旦线程死了,也就是run()方法结束,就不能再用start()方法让他运行,如,t.Start();t.start();会抛出IllegalThreadException异常。

 

·线程实现的两种方式:一是继承Thread,另一种是实现Runnable接口(建议使用此方式,以为可以避免多继承的限制),以start()方法开始启动线程,然后JVM找到run()方法运行。

public class MyThread implements Runnable {

    public void run(){

       for(;;){

           try {

              Thread.sleep(300);

           } catch (InterruptedException e) {

              e.printStackTrace();

           }

           System.out.println(Thread.currentThread().getName()+"正在运行");

       }

    }

    public static void main(String[] args) {

       MyThread mt = new MyThread();

       new Thread(mt).start();

       new Thread(mt).start();

    }

}

/*Thread-0正在运行

Thread-1正在运行

Thread-0正在运行

Thread-1正在运行

Thread-0正在运行

Thread-1正在运行

``````

*/

注意:Runnble接口中没有定义start()方法,但是可以Thread中定义了

public Thread(Runnable targt)//构造函数,来接受一个Runnable接口实例

所有可以以 newThread(myThread).start();来启动线程

 

·探究Thread和Runnable的关系:(含有一种代理设计模式)

 

 

·获取正在运行的线程,staticThread currentThread()//返回引用

·休眠:staticvoid sleep();

·中断:voidinterrupt()

 

·Thread中的isAlive()方法为true的时期是在start()开始到run()方法结束。

 

·Synchronized:表示一次只有一个线程可以执行代码的受保护部分

Volatile:用volatile声明的变量,任何对这变量进行读写操作的时候都会绕过高速缓存,直接主内存进行读写。

 

·守护进程(daemon)是指在UNIX或其他多任务操作系统中在后台执行的电脑程序,并不会接受电脑用户的直接操控;Thread中可以setDaemon(true);表示把线程设为守护进程、守护线程具有最低优先级,用于未系统中的其他对象和线程提供服务。

 

·注意:wait()、notify()、notifyAll()方法是属于Object类的,而不是Thread类。

 wait():就态,可以从调用notify变为wait()、或者时间片用完变来。

notify()、notifyAll()就是唤醒激活 :是从阻塞---->就绪态wait()


·public static void yield()//暂停当前正在执行的线程对象,并执行其他线程  就是从运行---->阻塞



一下是从网上找过来的:

sleep和wait都是使线程暂时停止执行的方法
,但它们有很大的不同,sleep是线程类Thread 的方法,
它是使当前线程暂时睡眠,可以放在任何位置。
而wait是Object类的方法,它是使当前线程暂时放弃对象的使用权进行等待,
必须放在同步方法或同步块里。
Sleep使用的时候,线程并不会放弃对象的使用权,即不会释放对象锁,所以在同步方法或同步块中使用sleep,一个线


程访问时,其他的线程也是无法访问的。
而wait是会释放对象锁的,就是当前线程放弃对象的使用权,让其他的线程可以访问。
线程执行wait方法时,需要另一个线程调用notify进行唤醒。
而sleep只是暂时休眠一定时间,时间到了之后,自动恢复运行,不需另外的线程唤醒。


sleep方法是让当前线程等待特定时间(由sleep参数决定)
而wait方法是等待知道别的线程给你发信号,你接收到信号后可以继续往下走


sleep()方法:sleep()使当前线程进入停滞状态(阻塞当前线程),让出CUP的使用、目的是不让当前线程独自霸占该进程所获的CPU资源,以留一定时间给其他线程执行的机会; sleep()是Thread类的Static(静态)的方法;因此他不能改变对象的机锁,所以当在一个Synchronized块中调用Sleep()方法是,线程虽然休眠了,但是对象的机锁并木有被释放,其他线程无法访问这个对象(即使睡着也持有对象锁)。在sleep()休眠时间期满后,该线程不一定会立即执行,这是因为其它线程可能正在运行而且没有被调度为放弃执行,除非此线程具有更高的优先级。

wait()方法:wait()方法是Object类里的方法;当一个线程执行到wait()方法时,它就进入到一个和该对象相关的等待池中,同时失去(释放)了对象的机锁(暂时失去机锁,wait(long timeout)超时时间到后还需要返还对象锁);其他线程可以访问wait()使用notify或者notifyAlll或者指定睡眠时间来唤醒当前等待池中的线程。wiat()必须放synchronized block中,否则会在program runtime时扔出”java.lang.IllegalMonitorStateException“异常。

所以sleep()和wait()方法的最大区别是:sleep()睡眠时,保持对象锁,仍然占有该锁;而wait()睡眠时,释放对象锁。但是wait()和sleep()都可以通过interrupt()方法打断线程的暂停状态,从而使线程立刻抛出InterruptedException(但不建议使用该方法)。

所以sleep()和wait()方法的最大区别是:sleep()睡眠时,保持对象锁,仍然占有该锁;而wait()睡眠时,释放对象锁。但是wait()和sleep()都可以通过interrupt()方法打断线程的暂停状态,从而使线程立刻抛出InterruptedException(但不建议使用该方法)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值