一, java多线程----线程与进程
进程: 程序(任务)的执行过程,拥有资源(共享内存,共享资源)和线程(一个或者多个,至少一个)。 例如:打开任务管理器,qq,chrome,都属于进程。
线程: 系统中最小的执行单元,同一进程中有多个线程,线程共享进程的资源。 例如:qq的聊天发送消息。
单线程:程序中只有一个线程,实际上主方法就是一个主线程。
多线程:程序中运行多个任务, 目的是更好的使用cpu资源。
二,java多线程----线程的实现
简单一句话来说,继承Thead类或者实现Runnable这个接口,然后重写里面的run方法。
继承Thead类
1 public class MyThead extends Thread{ 2 3 private String name; 4 public MyThead(String name) { 5 this.name = name; 6 } 7 @Override 8 public void run() { 9 for (int i = 0; i < 1000; i++) { 10 System.out.println(name+"------"+i); 11 } 12 } 13 }
实现Runnable接口
1 public class MyRunnable implements Runnable{ 2 3 private String name; 4 public MyRunnable(String name) { 5 this.name = name; 6 } 7 @Override 8 public void run() { 9 for (int i = 0; i < 1000; i++) { 10 System.out.println(name+"----"+i); 11 } 12 13 } 14 15 }
启动线程
1 public class TheadDemo { 2 3 public static void main(String[] args) { 4 MyThead t1 = new MyThead("t1"); 5 MyThead t2 = new MyThead("t2"); 6 7 t1.start(); 8 t2.start(); 9 10 MyRunnable r1 = new MyRunnable("r1"); 11 MyRunnable r2 = new MyRunnable("r2"); 12 13 Thread t3 = new Thread(r1); 14 Thread t4 = new Thread(r2); 15 16 t3.start(); 17 t4.start(); 18 } 19 }
三,java多线程----线程的状态
创建状态:创建多线程对象。
就绪状态: 调用start(),等待cpu调用。
运行状态: 执行run()。
阻塞状态:暂时停止执行,将资源交给其他线程使用。
终止状态:线程结束。
四,java多线程----常用的方法(thead类里面)
获取当前线程的对象 currentThread()
得到线程名称 getName()
判断线程是否运行 isAlive()
线程的强行运行 join() 例如:俩个线程t1,t2, 当在t1执行的时候,t2调用join()方法,t1暂停不执行,t2执行,执行完成后,释放资源,t1接着执行。
线程的休眠 sleep() 例如:t1每执行一次,等待5秒 t1.sleep(5000)
线程的礼让 yield() 例如:俩个线程t1,t2, 当在t1执行的时候,t1调用yield()方法,t1暂停不执行,t2执行,执行完成后,释放资源,t1接着执行。
五,java多线程---- 优先级
MIN_PRIORITY 小
MAX_PRIORITY 大
NORM_PRIORITY 正常状态
如果什么都不设置,默认是5
线程的优先级其实可以影响线程的执行顺序,这里的影响是可能性的,有可能影响到了,也有可能没有 。
六,java多线程----同步与死锁
同步的俩种方式,同步代码块,同步方法
同步代码块格式
synchronized( 同步的对象){
同步的代码
};
同步方法
public synchronized void 方法名(){
同步的代码
};
例子:java代码实现火车站三个窗口进行卖票,如果没有同步的话,会怎么样,同步的话,又会出现怎么的情空呢?
没有同步的代码
1 class MyRun implements Runnable{ 2 //火车站有5张票 3 private int ticket = 5; 4 @Override 5 public void run() { 6 for (int i = 0; i < 10; i++) { 7 if(ticket > 0){ 8 try { 9 Thread.sleep(500); 10 } catch (InterruptedException e) { 11 e.printStackTrace(); 12 } 13 System.out.println("车票:"+ticket--); 14 } 15 } 16 } 17 } 18 public class TheadDemo { 19 20 public static void main(String[] args) { 21 MyRun run = new MyRun(); 22 Thread t1 = new Thread(run, "窗口一"); 23 Thread t2 = new Thread(run, "窗口二"); 24 Thread t3 = new Thread(run, "窗口三"); 25 26 t1.start(); 27 t2.start(); 28 t3.start(); 29 } 30 }
结果;
同步代码块实现代码
1 class MyRun implements Runnable{ 2 //火车站有5张票 3 private int ticket = 5; 4 @Override 5 public void run() { 6 for (int i = 0; i < 10; i++) { 7 synchronized (this) { 8 if(ticket > 0){ 9 try { 10 Thread.sleep(500); 11 } catch (InterruptedException e) { 12 e.printStackTrace(); 13 } 14 System.out.println("车票:"+ticket--); 15 } 16 } 17 } 18 } 19 } 20 public class TheadDemo { 21 22 public static void main(String[] args) { 23 MyRun run = new MyRun(); 24 Thread t1 = new Thread(run, "窗口一"); 25 Thread t2 = new Thread(run, "窗口二"); 26 Thread t3 = new Thread(run, "窗口三"); 27 28 t1.start(); 29 t2.start(); 30 t3.start(); 31 } 32 }
结果:
结论:在多线程的情况下,为了确保资源准确,或者说数据的准确,我们必须使用线程同步。也就是说加synchronized关键字
死锁的概念-------所谓死锁是指多个进 程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都将无法向前推进。
http://c.biancheng.net/cpp/html/2604.html 可以看看该文章,里面解释的很清楚。
七,java多线程----线程的生命周期