二.3 java高级-多线程

一,线程概述java

1.进程:正在运行的程序安全

2.线程:进程中同时运行的多个执行单元多线程

关键字:共享资源,spa

 

3.多线程可使:多段程序代码交替运行(一段程序代码能够看作一个线程任务)线程

 

二,线程的建立code

1.继承Thread类,重写run()方法对象

(1)建立代码blog

MyThread thread1=new MyThread(“thread1”);
MyThread thread2=new MyThread(“thread2”);

2.实现Runnable接口,重写run()方法继承

(1)建立代码接口

 

MyThread myThread=new MyThread();  //多了步建立继承类的实例对象
Thread thread1=new Thread(myThread,“thread1”);
Thread thread2=new Thread(myThread,“thread2”);

3.实现Callable接口,重写call()方法,并使用Future来获取call()方法的返回结果

(1)建立代码

 

MyThread myThread=new MyThread();

FutureTask ft1=new FutureTask(myThread);    //多了部包装
Thread thread1=new Thread(ft1,“thread1”);

FutureTask ft2=new FutureTask(myThread);
Thread thread2=new Thread(ft2,“thread2”);

三种实现方法对比:

(2)每种方法都比前一种多了一步

(2)实现Runnable或Callable 适合多个线程去处理同一个共享资源的状况,将线程同程序代码、数据有效分离

    继承Thread没法资源共享。故只能建立一个售票程序,而后开启多个线程去共享同一个售票对象的售票方法,即让4个线程运行同一个售票程序

(3)避免java单继承带来的局限性

 

三.线程的生命周期及状态转换

 

四.线程的调度

1.定义:java虚拟机为线程分配CPU的使用权

2.分时调度模型/抢占式调度模型。java虚拟机默认采用抢占式调度模型

3.线程的优先级

(1)优先级越高得到CPU的机会越大

4.线程休眠 Thread.sleep(long millis)

(1)定义:使正在执行的线程暂停,把CPU让给其余线程

(2)Running--->Timed_Wating--->Ready  休眠时间完了才会进入Ready状态,才有机会得到CPU

5.线程让步 Thread.yield()

(1)与线程休眠的区别:不会阻塞该线程,只是将线程直接转换到Ready状态,让系统的调度器从新调度

6.线程插队 thread2.join()

 

五.多线程同步

(多线程去访问同一个资源,也会引起一些安全问题)

(前面经过实现Runnable接口的方式,并不能彻底解决线程同步问题)

定义:为了解决线程安全问题,限制某个资源在同一时刻只能被一个线程访问

1.线程安全

解决:处理共享资源的代码在任意时刻只能有一个线程访问

2.同步代码块  synchronized(lock)

3.同步方法   修饰符synchronized

4.同步锁    Lock lock(lock.lock(),lock.unlock())

5.死锁问题

 

六.多线程通讯  wait()/notify(),notifyAll()

(1)wait()  使当前线程进入等待状态

    notify()/notifyAll() 唤醒当前处于等待状态的线程  

七.线程池

 

 

 

 

续:

1.wait和sleep的区别

(1).调用wait()方法会释放对象的锁。所以wait方法通常被用于同步方法或者同步代码块中

(2).与wait方法不一样的是,sleep方法不会释放当前占有的锁

2.多线程中,为了保证数据的一致性,一般须要在使用对象或者方法前加锁

3.同步块是访问共享资源的代码块。给共享资源上了个锁

相关文章
相关标签/搜索