线程基本介绍
2021-03-12 15:35
标签:另一个 demo1 多线程 ace out 关系 直接 img 的区别 一、线程的基本状态 各种状态一目了然,值得一提的是"blocked"这个状态: 此外,在runnable状态的线程是处于被调度的线程,此时的调度顺序是不一定的。Thread类中的yield方法可以让一个running状态的线程转入runnable。 二、synchronized, wait, notify 是任何对象都具有的同步工具。 wait/notify必须存在于synchronized块中。并且,这三个关键字针对的是同一个监视器(某对象的监视器)。这意味着wait之后,其他线程可以进入同步块执行。当某代码并不持有监视器的使用权时(如图中5的状态,即脱离同步块)去wait或notify,会抛出java.lang.IllegalMonitorStateException。也包括在synchronized块中去调用另一个对象的wait/notify,因为不同对象的监视器不同,同样会抛出此异常。 synchronized单独使用: 三、线程的两种创建方式 1.通过继承Thread类 2.通过实现Runnable接口 两者的区别: 线程基本介绍 标签:另一个 demo1 多线程 ace out 关系 直接 img 的区别 原文地址:https://www.cnblogs.com/xujf/p/13215229.html
线程在Running的过程中可能会遇到阻塞(Blocked)情况
public class Thread1 implements Runnable {
Object lock;
public void run() {
synchronized(lock){
..do something
}
}
}
public class Thread1 implements Runnable {
public synchronized void run() {
..do something
}
}
/**
* 生产者生产出来的产品交给店员
*/
public synchronized void produce()
{
if(this.product >= MAX_PRODUCT)
{
try
{
wait();
System.out.println("产品已满,请稍候再生产");
}
catch(InterruptedException e)
{
e.printStackTrace();
}
return;
}
this.product++;
System.out.println("生产者生产第" + this.product + "个产品.");
notifyAll(); //通知等待区的消费者可以取出产品了
}
/**
* 消费者从店员取产品
*/
public synchronized void consume()
{
if(this.product MIN_PRODUCT)
{
try
{
wait();
System.out.println("缺货,稍候再取");
}
catch (InterruptedException e)
{
e.printStackTrace();
}
return;
}
System.out.println("消费者取走了第" + this.product + "个产品.");
this.product--;
notifyAll(); //通知等待去的生产者可以生产产品了
}
package com.wc.study.thread.demo1;
public class CreateThreadByExtends extends Thread{
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
public static void main(String[] args) {
Thread thread1 = new CreateThreadByExtends();
Thread thread2 = new CreateThreadByExtends();
thread1.start();
thread2.start();
}
}
package com.wc.study.thread.demo1;
public class CreateThreadByRunnable implements Runnable{
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
public static void main(String[] args) {
Thread thread1 = new Thread(new CreateThreadByRunnable());
Thread thread2 = new Thread(new CreateThreadByRunnable());
thread1.start();
thread2.start();
}
}