·线程是进程中的不同执行路径,进程消失,线程也跟着消失。
·线程存在:创建、就绪、运行、阻塞和死亡状态。
·一旦线程死了,也就是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(但不建议使用该方法)。