七.多线程技术
多线程技术
多线程基本概念_程序_进程_线程
·程序、进程、线程
程序:(program)是一个指令的集合
进程:Process,(正在执行中的程序)是一个静态的概念。进程是程序的异常静态执行过程,占用特定的地址空间,每个进程都是独立的,有3部分组成cup,data,code
缺点:内存的浪费,CPU的负担
线程:是进程中一个“单一的连续控制流程”。CPU调度的是线程
通过继承Thread类实现多线程
·实现多线程的步骤
1.继承Thread类
2.重写run()方法
3.通过start()方法启动线程
1 package com.zqf.threadproject; 2 3 public class Test { 4 public static void main(String[] args) { 5 MyThread my = new MyThread(); 6 my.start(); //启动线程 7 System.out.println("-------main"); 8 } 9 }
1 package com.zqf.threadproject; 2 3 public class MyThread { 4 5 public void start() { 6 // TODO Auto-generated method stub 7 //线程体 8 System.out.println("MyThread-----"); 9 } 10 }
通过实现Runnable接口实现多线程
·步骤
- 编写类实现Runnable接口
- 实现run()方法
- 通过Thread类的start()方法启动线程
1 package com.zqf.runnableproject; 2 3 public class test1 { 4 public static void main(String[] args) { 5 //创建线程类的对象 6 MyRunnable my=new MyRunnable(); 7 //start()方法是Thread类中的方法 8 Thread t = new Thread(my); 9 t.start(); //启动线程 10 //主线程中的循环 11 for(int i=0;i<10;i++){ 12 System.out.println("-------mian()"); 13 } 14 } 15 }
1 package com.zqf.runnableproject; 2 3 public class MyRunnable implements Runnable{ //具备了多线程操作能力 4 5 @Override 6 public void run() { 7 for(int i=0;i<10;i++){ 8 System.out.println("MyRunnable.run()-----"+i); 9 } 10 } 11 }
线程状态
获取线程基本信息的方法
·线程操作的常用方法
static Thread currentThread() 返回目前正在执行的线程
1 package com.zqf.threadmethodproject; 2 3 public class TestThreadMethod { 4 public static void main(String[] args) { 5 Thread t = Thread.currentThread(); //获取当前正在执行的线程对象 6 //toString()方法得到的内容为[线程名称,线程的优先级,线程组的名称] 7 System.out.println(t.toString()); 8 9 //创建线程类的对象 10 MyRunnable my =new MyRunnable(); 11 Thread t1 = new Thread(my); 12 Thread t2 = new Thread(my); 13 Thread t3 = new Thread(my); 14 15 //启动线程 16 t1.start(); 17 t2.start(); 18 t3.start(); 19 /**在Thread类中一定有一个静态变量int,用于统计创建线程的个数*/ 20 } 21 } 22 class MyRunnable implements Runnable{ //创建MyRunnable类实现Runnable接口 23 24 @Override 25 public void run() { 26 Thread t = Thread.currentThread(); 27 System.out.println(t); 28 } 29 30 }
final String getName() 返回线程的名称
final boolean isAlibe() 判断线程是否处于活动状态
1 package com.zqf.threadmethodproject; 2 3 public class TestIsAliva { 4 public static void main(String[] args) { 5 //主线程 6 MyThread my =new MyThread(); 7 System.out.println("线程my处于新生状态的线程是否处于活动状态"); 8 my.start(); //启动线程 9 System.out.println("线程my处于就绪状态的线程是否处于活动状态:"+my.isAlive() 10 ); 11 //主线程中的循环 12 for(int i=0;i<10;i++){ 13 System.out.println("-------"+Thread.currentThread().getName()+"---------->"+i); 14 } 15 //主线程中的最后一句代码 16 System.out.println("my线程是否处于活动状态:"+my.isAlive()); 17 } 18 } 19 class MyThread extends Thread{ 20 public void run(){ 21 for(int i = 0;i<10;i++){ 22 System.out.println(Thread.currentThread().getName()+"---------->"+i); 23 } 24 } 25 }
多线程的安全问题
多线程的安全性问题:如300人买票5张票的问题
暂停线程执行sleep、yield、stop、join
线程的优先级问题
1 package com.zqf.threadpriority; 2 3 public class Test { 4 public static void main(String[] args) { 5 System.out.println("最高优先级:"+Thread.MAX_PRIORITY); 6 System.out.println("最低优先级:"+Thread.MIN_PRIORITY); 7 System.out.println("默认优先级:"+Thread.NORM_PRIORITY); 8 //主线程的优先级 9 Thread t = Thread.currentThread(); 10 System.out.println("获取主线程的优先级:"+t.getPriority()); 11 Thread t2 = new Thread(new MyThread()); 12 System.out.println("新建的线程优先级:"+t2.getPriority()); 13 /** 14 * 优先级越高越有可能先被调用执行,但是不一定 15 * */ 16 t2.setPriority(6); 17 System.out.println("t2线程的优先级:"+t2.getPriority()); 18 //t2.setPriority(100); //由于超出了优先级,故会报错 19 } 20 } 21 class MyThread implements Runnable{ 22 public void run() { 23 } 24 }
线程同步 具体实现
·同步实现的方式
同步代码块
synchronized(obj){ } //obj称为同步监视器
·同步方法
死锁_死锁的解决办法
·产生死锁
1 package com.zqf.deadLockProject; 2 3 public class DeadLock extends Thread{ 4 private Object money; //钱 5 private Object water; //水 6 public boolean flag; //标识持有对象锁 7 public DeadLock(Object money, Object water) { 8 super(); 9 this.money = money; 10 this.water = water; 11 } 12 13 @Override 14 public void run() { 15 if(flag){ //true时,持有“钱”的锁 16 synchronized(money){ 17 System.out.println("有钱,等水"); 18 try { 19 Thread.sleep(300); 20 } catch (InterruptedException e) { 21 // TODO Auto-generated catch block 22 e.printStackTrace(); 23 } 24 synchronized(water){} 25 System.out.println("有水,等钱"); 26 } 27 }else{ 28 synchronized(water){ 29 System.out.println("有水,等钱"); 30 try { 31 Thread.sleep(300); 32 } catch (InterruptedException e) { 33 // TODO Auto-generated catch block 34 e.printStackTrace(); 35 } 36 synchronized(money){ 37 System.out.println("有钱,等水"); 38 } 39 } 40 } 41 } 42 }
1 package com.zqf.deadLockProject; 2 3 public class Test { 4 public static void main(String[] args) { 5 //创建共享资源的对象 6 Object money= new Object(); 7 Object water = new Object(); 8 //创建线程类的对象 9 DeadLock d1 = new DeadLock(money,water); 10 DeadLock d2 = new DeadLock(money,water); 11 d1.flag= true; 12 d2.flag= false; 13 //启动线程 14 d1.start(); 15 d2.start(); 16 } 17 }
·解决死锁
1 package com.zqf.deadLockProject; 2 3 public class DeadLock2 extends Thread{ 4 private Object money; //钱 5 private Object water; //水 6 public boolean flag; //标识持有对象锁 7 public DeadLock2(Object money, Object water) { 8 super(); 9 this.money = money; 10 this.water = water; 11 } 12 13 @Override 14 public void run() { 15 if(flag){ //true时,持有“钱”的锁 16 synchronized(money){ 17 System.out.println("有钱,等水"); 18 try { 19 Thread.sleep(300); 20 } catch (InterruptedException e) { 21 // TODO Auto-generated catch block 22 e.printStackTrace(); 23 } 24 synchronized(water){} 25 System.out.println("有水,等钱"); 26 } 27 }else{ 28 synchronized(water){ 29 System.out.println("有水,等钱"); 30 try { 31 Thread.sleep(300); 32 } catch (InterruptedException e) { 33 // TODO Auto-generated catch block 34 e.printStackTrace(); 35 } 36 37 } 38 synchronized(money){ 39 System.out.println("有钱,等水"); 40 } 41 } 42 } 43 }
1 package com.zqf.deadLockProject; 2 3 public class DeadLock2 extends Thread{ 4 private Object money; //钱 5 private Object water; //水 6 public boolean flag; //标识持有对象锁 7 public DeadLock2(Object money, Object water) { 8 super(); 9 this.money = money; 10 this.water = water; 11 } 12 13 @Override 14 public void run() { 15 if(flag){ //true时,持有“钱”的锁 16 synchronized(money){ 17 System.out.println("有钱,等水"); 18 try { 19 Thread.sleep(300); 20 } catch (InterruptedException e) { 21 // TODO Auto-generated catch block 22 e.printStackTrace(); 23 } 24 synchronized(water){} 25 System.out.println("有水,等钱"); 26 } 27 }else{ 28 synchronized(water){ 29 System.out.println("有水,等钱"); 30 try { 31 Thread.sleep(300); 32 } catch (InterruptedException e) { 33 // TODO Auto-generated catch block 34 e.printStackTrace(); 35 } 36 37 } 38 synchronized(money){ 39 System.out.println("有钱,等水"); 40 } 41 } 42 } 43 }
生产者消费者模式的实现
·生产者与消费者原理
·产生的问题
数据错乱