Java基础之多线程
来源:互联网 发布:php二分查找算法 编辑:程序博客网 时间:2024/05/22 12:28
前提:刚刚开始认真的学习Java基础,巩固加复习,由于是新手,所以有错的地方请多多提出,这些只是我自己的理解,如果不够全面,或者有错误也希望多理解,多指出。
1.说一下Thread类中常用的与多线程生命周期相关方法:
yield():
让其他线程允许占用自己的资源,但并不一定有其他线程占用自己的资源。
//举例说明,以下线程都不是线程安全的,仅供参考public class TestThread { public static void main(String[] args) { Window w1 = new Window(); Window w2 = new Window(); w1.setName("窗口1"); w2.setName("窗口2"); w1.start(); w2.start(); }}class Window extends Thread{ static int tickets = 5; public void saleTicket(){ while(true){ if(tickets > 0){ System.out.println(Thread.currentThread().getName()+ ": 售出第"+tickets--+"张票"); Thread.yield();//让线程yield }else{ break; } } } public void run(){ saleTicket(); }}
join():
可以使得一个线程在另一个线程结束后再执行。如果join()方法在一个线程实例上调用,当前运行着的线程将阻塞直到这个线程实例完成了执行。
//代码示例,以下线程都不是线程安全的,仅供参考public class TestThread { public static void main(String[] args) { Window w1 = new Window(); Window w2 = new Window(); w1.setName("窗口1"); w2.setName("窗口2"); w1.start(); try { w1.join();//让w1抢占资源 } catch (InterruptedException e) { e.printStackTrace(); } w2.start(); }}class Window extends Thread{ static int tickets = 5; public void saleTicket(){ while(true){ if(tickets > 0){ System.out.println(Thread.currentThread().getName()+ ": 售出第"+tickets--+"张票"); }else{ break; } } } public void run(){ saleTicket(); }}
sleep():
表面意思就是休眠;表示让一个线程进入休眠状态,休眠一定的时间以后进入运行。
//代码示例,以下线程都不是线程安全的,仅供参考public class TestThread { public static void main(String[] args) { Window w1 = new Window(); Window w2 = new Window(); w1.setName("窗口1"); w2.setName("窗口2"); w1.start(); w2.start(); }}class Window extends Thread{ static int tickets = 5; public void saleTicket(){ while(true){ try { Thread.sleep(10);//让线程进入休眠 } catch (InterruptedException e) { e.printStackTrace(); } if(tickets > 0){ System.out.println(Thread.currentThread().getName()+ ": 售出第"+tickets--+"张票"); }else{ break; } } } public void run(){ saleTicket(); }}
wait():
让一个线程进入等待,需要有notify()方法唤醒线程。
notify():
唤醒一个等待的线程。
notifyAll():
唤醒所有等待的线程。wait(),notify(),notifyAll().这三个方法必须在同步代码块中使用。
//示例代码(wait,notify,notifyAll),此线程是线程安全的,仅供参考public class TestRunnable { public static void main(String[] args) { Window1 w1 = new Window1(); Thread t1 = new Thread(w1); Thread t2 = new Thread(w1); t1.setName("窗口1"); t2.setName("窗口2"); t1.start(); t2.start(); }}class Window1 implements Runnable{ static Integer tickets = 5; public void saleTicket(){ while(true){ synchronized (this) { notifyAll();//下一个线程过来叫醒等待的线程 //notify();或者用这个方法 if(tickets > 0){ System.out.println(Thread.currentThread().getName()+ ": 售出第"+tickets--+"张票"); }else{ break; } try { wait();//让其等待 } catch (InterruptedException e) { e.printStackTrace(); } } } } public void run(){ saleTicket(); }}
2.wait方法和sleep方法的区别
- wait方法是Object类里面的方法,sleep是Thread类里面的方法
- wait,notify,notifyAll方法在多线程的使用中需要在 synchronized 代码块中,或者synchronized 修饰的方法中使用。注意:如果当前线程不是对象所得持有者,该方法抛出一个java.lang.IllegalMonitorStateException 异常”。sleep方法可以在任何地方使用。
- 在同步锁中使用sleep并不会释放锁,但是wait在同步锁中被调用时,将会失去同步锁,进入等待状态。
3.这几个方法的与运行周期之间的关系,如下图:
0 0
- java基础之多线程
- java基础之多线程
- Java基础之多线程
- java基础之多线程
- java基础之多线程
- Java基础之多线程
- Java基础之多线程
- Java基础之多线程
- JAVA基础之多线程
- Java基础之多线程
- java基础之多线程
- Java基础之多线程
- java基础之多线程
- java基础之多线程
- Java基础之多线程
- Java基础之多线程
- Java基础之多线程
- Java基础之多线程
- RTMP协议分析
- 杂
- c/c++static关键字
- Promise对象
- ASP.NET Forms身份验证登录
- Java基础之多线程
- Hadoop&HBase部署文档
- 凸优化学习笔记(2)——凸函数
- ASP和JSP的区别是什么
- Android学习记录:ViewPager实现欢迎页
- Activiti学习——环境搭建
- 剑指offer(51)-字符流中第一个不重复的字符
- 人脸识别助力网络支付实名制落地推进
- Serializable和Parcelable的解析与使用