标签:lazy 就是 ide 进程 notify 常用 runnable cal 常见
public class MyThread extends Thread{ /** 利用继承中的特点 * 将线程名称传递 进行设置 */ public MyThread(String name){ super(name); }/** 重写run方法 * 定义线程要执行的代码 */ public void run(){ for (int i = 0; i < 20; i++) { //getName()方法 来自父亲 //getName()方法 来自父亲 System.out.println(getName()+i); } } }
public class Demo { public static void main(String[] args) { System.out.println("这里是main线程"); MyThread mt = new MyThread("小强"); mt.start();//开启了一个新的线程 for (int i = 0; i < 20; i++) { System.out.println("旺财:" + i); } } }
public class MyRunnable implements Runnable { @Override public void run() { for (int i = 0; i < 20; i++) { System.out.println(Thread.currentThread().getName() + " " + i); } } } public class Demo { public static void main(String[] args) { //创建自定义类对象 线程任务对象 MyRunnable mr = new MyRunnable(); //创建线程对象 Thread t = new Thread(mr, "小强"); t.start(); for (int i = 0; i < 20; i++) { System.out.println("旺财 " + i); } } }
public class NoNameInnerClassThread { public static void main(String[] args) { // new Runnable(){ // public void run(){ // for (int i = 0; i < 20; i++) { // System.out.println("张宇:"+i); // } // } // }; // ‐‐‐这个整体 相当于new MyRunnable() Runnable r = new Runnable() { public void run() { for (int i = 0; i < 20; i++) { System.out.println("张宇:" + i); } } }; new Thread(r).start(); for (int i = 0; i < 20; i++) { System.out.println("费玉清:" + i); } } }
public class Ticket implements Runnable { private int ticket = 100; /** * 执行卖票操作 */ @Override public void run() { //每个窗口卖票的操作 // 窗口 永远开启 while (true) { if (ticket > 0) { //有票 可以卖 // 出票操作 // 使用sleep模拟一下出票时间 try { Thread.sleep(100); } catch (InterruptedException e) { // TODO Auto‐generated catch block e.printStackTrace(); } //获取当前线程对象的名字 String name = Thread.currentThread().getName(); System.out.println(name + "正在卖:" + ticket); ticket--; } } } } } public class Demo { public static void main(String[] args) { //创建线程任务对象 Ticket ticket = new Ticket(); //创建三个窗口对象 Thread t1 = new Thread(ticket, "窗口1"); Thread t2 = new Thread(ticket, "窗口2"); Thread t3 = new Thread(ticket, "窗口3"); //同时卖票 t1.start(); t2.start(); t3.start(); } }
synchronized(同步锁){ 需要同步操作的代码 }
public synchronized void method(){ 可能会产生线程安全问题的代码 }
Lock lock = new ReentrantLock();
java.util.concurrent.locks.Lock 机制提供了比synchronized代码块和synchronized方法更广泛的锁定操作, 同步代码块/同步方法具有的功能Lock都有,除此之外更强大,更体现面向对象。 Lock锁也称同步锁,加锁与释放锁方法化了,如下:
public void lock() :加同步锁。 public void unlock() :释放同步锁。
package com.itheima.demo10.WaitAndNotify; /* 进入到TimeWaiting(计时等待)有两种方式 1.使用sleep(long m)方法,在毫秒值结束之后,线程睡醒进入到Runnable/Blocked状态 2.使用wait(long m)方法,wait方法如果在毫秒值结束之后,还没有被notify唤醒,就会自动醒来,线程睡醒进入到Runnable/Blocked状态 唤醒的方法: void notify() 唤醒在此对象监视器上等待的单个线程。 void notifyAll() 唤醒在此对象监视器上等待的所有线程。 */ public class Demo02WaitAndNotify { public static void main(String[] args) { //创建锁对象,保证唯一 Object obj = new Object(); // 创建一个顾客线程(消费者) new Thread(){ @Override public void run() { //一直等着买包子 while(true){ //保证等待和唤醒的线程只能有一个执行,需要使用同步技术 synchronized (obj){ System.out.println("顾客1告知老板要的包子的种类和数量"); //调用wait方法,放弃cpu的执行,进入到WAITING状态(无限等待) try { obj.wait(); } catch (InterruptedException e) { e.printStackTrace(); } //唤醒之后执行的代码 System.out.println("包子已经做好了,顾客1开吃!"); System.out.println("---------------------------------------"); } } } }.start(); // 创建一个顾客线程(消费者) new Thread(){ @Override public void run() { //一直等着买包子 while(true){ //保证等待和唤醒的线程只能有一个执行,需要使用同步技术 synchronized (obj){ System.out.println("顾客2告知老板要的包子的种类和数量"); //调用wait方法,放弃cpu的执行,进入到WAITING状态(无限等待) try { obj.wait(); } catch (InterruptedException e) { e.printStackTrace(); } //唤醒之后执行的代码 System.out.println("包子已经做好了,顾客2开吃!"); System.out.println("---------------------------------------"); } } } }.start(); //创建一个老板线程(生产者) new Thread(){ @Override public void run() { //一直做包子 while (true){ //花了5秒做包子 try { Thread.sleep(5000);//花5秒钟做包子 } catch (InterruptedException e) { e.printStackTrace(); } //保证等待和唤醒的线程只能有一个执行,需要使用同步技术 synchronized (obj){ System.out.println("老板5秒钟之后做好包子,告知顾客,可以吃包子了"); //做好包子之后,调用notify方法,唤醒顾客吃包子 //obj.notify();//如果有多个等待线程,随机唤醒一个 obj.notifyAll();//唤醒所有等待的线程 } } } }.start(); } }
package com.itheima.demo10.WaitAndNotify; /* 进入到TimeWaiting(计时等待)有两种方式 1.使用sleep(long m)方法,在毫秒值结束之后,线程睡醒进入到Runnable/Blocked状态 2.使用wait(long m)方法,wait方法如果在毫秒值结束之后,还没有被notify唤醒,就会自动醒来,线程睡醒进入到Runnable/Blocked状态 唤醒的方法: void notify() 唤醒在此对象监视器上等待的单个线程。 void notifyAll() 唤醒在此对象监视器上等待的所有线程。 */ public class Demo02WaitAndNotify { public static void main(String[] args) { //创建锁对象,保证唯一 Object obj = new Object(); // 创建一个顾客线程(消费者) new Thread(){ @Override public void run() { //一直等着买包子 while(true){ //保证等待和唤醒的线程只能有一个执行,需要使用同步技术 synchronized (obj){ System.out.println("顾客1告知老板要的包子的种类和数量"); //调用wait方法,放弃cpu的执行,进入到WAITING状态(无限等待) try { obj.wait(); } catch (InterruptedException e) { e.printStackTrace(); } //唤醒之后执行的代码 System.out.println("包子已经做好了,顾客1开吃!"); System.out.println("---------------------------------------"); } } } }.start(); // 创建一个顾客线程(消费者) new Thread(){ @Override public void run() { //一直等着买包子 while(true){ //保证等待和唤醒的线程只能有一个执行,需要使用同步技术 synchronized (obj){ System.out.println("顾客2告知老板要的包子的种类和数量"); //调用wait方法,放弃cpu的执行,进入到WAITING状态(无限等待) try { obj.wait(); } catch (InterruptedException e) { e.printStackTrace(); } //唤醒之后执行的代码 System.out.println("包子已经做好了,顾客2开吃!"); System.out.println("---------------------------------------"); } } } }.start(); //创建一个老板线程(生产者) new Thread(){ @Override public void run() { //一直做包子 while (true){ //花了5秒做包子 try { Thread.sleep(5000);//花5秒钟做包子 } catch (InterruptedException e) { e.printStackTrace(); } //保证等待和唤醒的线程只能有一个执行,需要使用同步技术 synchronized (obj){ System.out.println("老板5秒钟之后做好包子,告知顾客,可以吃包子了"); //做好包子之后,调用notify方法,唤醒顾客吃包子 //obj.notify();//如果有多个等待线程,随机唤醒一个 obj.notifyAll();//唤醒所有等待的线程 } } } }.start(); } }
标签:lazy 就是 ide 进程 notify 常用 runnable cal 常见
原文地址:https://www.cnblogs.com/qqfff/p/13155186.html