12.java 多线程笔记
---------------多线程------------------------------
*进程:正在执行的程序 线程:进程中的一条执行路径
1.继承受到单继承的局限。
2.通过Runnable接口的方式,同一个实现类对象,启动的多个线程, 可以实现成员变量的数据共享。
启动方式一:
继承:
1.继承Thread类
2.重写run()
3.start()
启动方式二:
实现:
1.实现Runnable接口
2.重写run()
3.通过实现类对象,将实现类对象传入构建好的Thread类对象,start()
class MyThread06 extends Thread {
private int i = 0;
@Override
public void run() {
while (i < 10) {
System.out.println("子线程:" + i++);
}
}
}
class MyThread006 implements Runnable {
// private int i = 0;
@Override
public void run() {
int i = 0;
while (i < 10) {
System.out.println(Thread.currentThread().getId() + "....子线程:" + i++);
}
}
}
public class Demo05_Thread05 {
public static void main(String[] args) {
// MyThread06 mt1 = new MyThread06();// i
// MyThread06 mt2 = new MyThread06();// i
// MyThread06 mt3 = new MyThread06();// i
// mt1.start();
// mt2.start();
// mt3.start();
MyThread006 mt = new MyThread006();
// MyThread006 mt2 = new MyThread006();
// MyThread006 mt3 = new MyThread006();
Thread t1 = new Thread(mt);
Thread t2 = new Thread(mt);
Thread t3 = new Thread(mt);
t1.start();
t2.start();
t3.start();
System.out.println("main...." + Thread.currentThread().getId());// 获取主线程did号
System.out.println("....." + t1.getId());// 8,在主线程中打印t1线程的id号:8
System.out.println("....." + t2.getId());// 9
System.out.println("....." + t3.getId());// 10
}
}
*继承Thread类想要共享数据,可以把要共享的数据静态
*Thread.currentThread().getId()获取主线程id
*主线程默认名字main
*run方法没有抛异常,所以在重写run方法时候,里面的内容不能抛异常,只能try
*sleep()方法是指当前线程睡眠,跟谁调用的sleep没关系
*新建3个线程,让他们睡眠时间都不同,可以在构造里面传时间,也可以通过进程名字判断,然后sleep
*Thread类主要方法
Thread()
Thread(Runnable target)
Thread(Runnable target, String name)
Thread(String name) 返回当前正在执行的线程对象
currentThread()
getId() 返回该线程的进程id
getName()返回该线程的名称
setName()设置该线程的名字
getPriority()返回线程优先级 最高10:MAX_PRIORTY 默认:5:NORM_PRIORTY 最低:1:MIN_PRIORTY
setPriority() 设置该线程的优先级
getState() 返回线程的五种状态
NEW至今尚未启动的线程处于这种状态。
RUNNABLE 正在 Java 虚拟机中执行的线程处于这种状态。
BLOCKED 受阻塞并等待某个监视器锁的线程处于这种状态。
WAITING 无限期地等待另一个线程来执行某一特定操作的线程处于这种状态。
TIMED_WAITING 等待另一个线程来执行取决于指定等待时间的操作的线程处于这种状态。
TERMINATED 已退出的线程处于这种状态。
join() 方法:谁调用,谁就能抢占主线程资源,直到调用方法的线程执行完后,再执行主线程
join(long millis) 最多抢多少毫秒
setDaemon(boolean on) 标记为守护线程