1.线程概述
2.线程实现(2种方式)
2.1通过Thread子类实现(Run方法、Start方法)
//继承Thread的方法开启多线程 public class Demo11_1 extends Thread{ public void run() { //线程运行的程序内容 for (int i = 0; i < 10; i++) { System.out.println(Thread.currentThread().getName() + ":" + i); } } public static void main(String[] args) { Demo11_1 d1 = new Demo11_1(); d1.setName("线程1"); d1.start(); //开启线程1 Demo11_1 d2 = new Demo11_1(); d2.setName("线程2"); d2.start(); //开启线程2 } }
2.2通过Runnable接口实现(Thread(Runnable target))---方便实现线程共享
//通过Runnable的方法开启多线程 public class Demo11_1 implements Runnable{ public void run() { //线程运行的程序内容 for (int i = 0; i < 10; i++) { System.out.println(Thread.currentThread().getName() + ":" + i); } } public static void main(String[] args) { Demo11_1 r1 = new Demo11_1(); Thread d1 = new Thread(r1); d1.setName("线程1"); d1.start(); //开启线程1 Demo11_1 r2 = new Demo11_1(); Thread d2 = new Thread(r2); d2.setName("线程2"); d2.start(); //开启线程2 } }
2.3 Thread和Runnable的区别
继承Thread类创建线程由于java的单重继承会受到一些限制,不能很好的实现数据共享,因此在实现数据共享时选用Runnable接口
3.线程的控制
3.1线程的生命周期
创建线程后需要通过start()方法启动线程,然后线程处于就绪状态,如果有多个线程同时执行,由于同一时间只能有一个线程就会出现堵塞状态。当线程处于堵塞状态后,就会处于暂时等待的情况,只有解除了等待后才会返回到就绪状态,直到线程运行结束或者使用interrupt()方法结束线程,线程才会进入到终止状态。
3.2线程的优先级
setPriority()设置线程优先级和getPriority()获得线程优先级
线程优先级是1-10之间整数或者三个枚举值
3.3线程的休眠与中断
sleep()指定线程休眠时间
interrupt()中止线程的执行
4.线程的同步与互斥
4.1线程安全问题与死锁
死锁的2种情况:相互排斥(一个线程永久独占资源而其他线程无法使用该资源一直处于等待状态的情况)和循环等待(相互等待形成循环等待)
避免死锁:有效控制每一线程的生命周期,确保同一时间只有一个线程访问同一资源
4.2线程同步(同步方法、同步代码块)
同步方法表示锁定方法只能同时被一个线程调用,其他线程必须处于等待状态,其调用变量必须使用private修饰,这样保证变量也被锁定。
//同步方法 synchronized void method(){ }
同步代码块可以锁定代码块中的内容,而不需要锁定整个方法。
//同步代码块 synchronized (object){ }
4.3线程间的通信(wait、notify)
线程间通信指线程之间可以通过等待和唤醒的方法相互通信,交替执行。
设置等待的方法是wait()方法,唤醒线程的方法是notify()方法,两者需要一同使用,如果有多个线程在等待,那么唤醒的是优先级高德线程。另外wait()方法可以指定等待的时间,在多线程程序中需要先唤醒其他线程后才可以将当前线程处于等待状态。
原文地址:https://www.cnblogs.com/zouhq/p/10543924.html
时间: 2024-11-02 23:11:42