关于多线程——Java笔记

目录

两种实现方式:两者都需要重写run()方法

线程共有以下6种状态:

 查看JVM中的线程名


三种实现方式:两者都需要重写run()方法

1.继承Thread类

2.是实现Runnable接口 

3.callable

线程共有以下6种状态:

新建:当使用new操作符创建新线程时               ---NEW

运行(可运行):当调用start()方法时                ---RUNNABLE

阻塞:当线程需要获得对象的内置锁,而该锁正被别的线程拥有时        ---

计时等待:对于一些含有时间参数的方法,例如Thread类的sleep()方法时等待:当线程等待其他线程通知调度表可以运行时

终止:当run()方法运行完毕或出现异常时

获得进程状态:Thread类的getState()方法可以获得线程的状态,该方法的返回值是Thread.State,它是线程状态的枚举

枚举常量

含义

NEW

新建状态

RUNNABLE

运行(可运行)状态

BLOCKED

阻塞状态

TIMED_WAITING

休眠状态

WAITING

等待状态

TERMINATED

终止状态

代码:

class ThreadState implements Runnable {

    public synchronized void waitForASecond() throws InterruptedException {

        wait(500);//使当前线程等待0.5秒或其他线程调用notify()或notifyAll()方法
    }

    public synchronized void waitForYears() throws InterruptedException {

        wait(); //使当前线程永久等待,直到其他线程调用notify()或notifyAll()方法

    }

    public synchronized void notifyNow() throws InterruptedException {

        notify();    //唤醒由调用wait()方法进入等待状态的线程

    }

}



public class Test {

    public static void main(String[] args) throws InterruptedException {

        ThreadState state = new ThreadState();       //创建State对象

        Thread thread = new Thread(state);            //利用State对象创建Thread对象

        System.out.println("新建线程:" + thread.getState());// 输出线程状态

        thread.start();         //调用thread对象的start()方法,启动新线程

        System.out.println("启动线程:" + thread.getState());// 输出线程状态

        Thread.sleep(100); //当前线程休眠0.1秒,使新线程运行waitForASecond()方法

        System.out.println("计时等待:" + thread.getState());// 输出线程状态

        Thread.sleep(1000);      //当前线程休眠1秒,使新线程运行waitForYears()方法

        System.out.println("等待线程:" + thread.getState());// 输出线程状态

        state.notifyNow();  //调用state的notifyNow()方法

        System.out.println("唤醒线程:" + thread.getState());// 输出线程状态

        Thread.sleep(1000);      //当前线程休眠1秒,使新线程结束

        System.out.println("终止线程:" + thread.getState());// 输出线程状态

    }

}

1.继承Thread类

代码例子:

class MyThread extends Thread{
	private String name;
	public MyThread(String name) {
		this.name=name;
	}
	@Override
	public void run() {
		for (int i=0;i<100;i++) {
			System.out.println(this.name+i);
		}
	}
}

public class Demo01 {

	public static void main(String[] args) {
		MyThread mt1 =new MyThread("线程A:");
		MyThread mt2 =new MyThread("线程B:");
		MyThread mt3 =new MyThread("线程C:");
		MyThread mt4 =new MyThread("线程D:");
		mt1.start();
		mt2.start();
		mt3.start();
		mt4.start();

	}

}

Runnable

避免单继承局限。在现实工作中最合适。

代码例子:

class MyThread implements Runnable{
	private String name;
	public MyThread(String name) {
		this.name=name;
	}
	@Override
	public void run() {
		for (int i=0;i<100;i++) {
			System.out.println(this.name+i);
		}
	}
}

public class Demo01 {

	public static void main(String[] args) {
		MyThread mt1 =new MyThread("线程A:");
		MyThread mt2 =new MyThread("线程B:");
		MyThread mt3 =new MyThread("线程C:");
		MyThread mt4 =new MyThread("线程D:");
		new Thread(mt1).start();
		new Thread(mt2).start();
		new Thread(mt3).start();
		new Thread(mt4).start();

	}

}

猜你喜欢

转载自blog.csdn.net/qq_36230524/article/details/82669239