1.多線程
例如:一個短視頻,一個線程復制管理視頻,一個線程負責管理聲音,一個線程負責管理彈幕
進程:Process,程序一旦開始運行就是是一個進程
線程:Thread,一個程序運行后,里面就包含了多個線程真正的多線程是指有多個cpu,即多核。如果是模擬的多線程,即只有一個cpu,在同一時間點,cpu只能執(zhí)行一個代碼,因為切換的很快,所以就有同時執(zhí)行的錯誤
2.線程的創(chuàng)建
1.繼承Thread類
線程不一定立即執(zhí)行,聽從cpu的安排,交替執(zhí)行
//實現(xiàn)步驟
1.繼承Thread
2.重些run方法
3.對象. start()啟動線程
public class StartThread extends Thread
{
@Override
public void run()
{
}
}
StartThread a=new StartThread();
a.start()
2.實現(xiàn)Runnable接口
接口實現(xiàn)類對象能被多個線程使用
1.實現(xiàn)接口
2.編寫線程方法
3.開啟線程,通過實現(xiàn)Runnable接口來創(chuàng)建線程,啟動線程時需要通過Thread對象。
PrimeRun p = new PrimeRun(143);
new Thread(p).start();
并發(fā)問題:
3.實現(xiàn)Callable接口
3.靜態(tài)代理
使用步驟
1.需要代理對象、實際對象,以及一個抽象接口
2.代理對象、實際對象都要實現(xiàn)接口
3.代理對象中創(chuàng)建構(gòu)造方法,方法參數(shù)為接口類對象
4.在代理對象中定義抽象接口類對象來接收構(gòu)造方法的參數(shù)對象
5.在代理對象中接口的實現(xiàn)方法中,用接收到的變量接口對象調(diào)用實現(xiàn)的接口方法
邏輯,通過代理對象的有參構(gòu)造,將實際對象以參數(shù)的形式傳遞到代理類中,然后在代理類接口的實現(xiàn)方法中,調(diào)用實際類中的實現(xiàn)方法
4.線程停止
1.設(shè)立外部標志位,定義一個公開的方法,通過改變標志位來結(jié)束進程
5.線程休眠
應用
1.模擬網(wǎng)絡(luò)延時
通過延時可以發(fā)現(xiàn)多線程中出現(xiàn)的問題,如數(shù)據(jù)同步性
2.倒計時每個對象都有一把鎖,sleep不回釋放鎖
6.線程禮讓
Thread.yield()
正在進行的線程,由運行態(tài)轉(zhuǎn)為就緒態(tài),然后由cpu在就緒態(tài)中選擇另一個線程,禮讓不一定百分百成功
7.線程強制執(zhí)行
線程插隊,強制執(zhí)行插隊的線程
8.觀測線程的狀態(tài)
Thread.getState()
線程的狀態(tài)
1.創(chuàng)建
2.就緒
3.執(zhí)行
4.阻塞
5.結(jié)束,線程一旦結(jié)束,就不能再被使用
9.線程的優(yōu)先級
thread.setPriority()
10.守護線程
監(jiān)控用戶線程,用戶線程結(jié)束,守護線程也結(jié)束thread.setDaemon()
11.線程同步
并發(fā):同一個對象被多個線程同時操作,如:秒殺,搶票
解決線程的不安全性:隊列+鎖,解決數(shù)據(jù)安全性synchronized
//修飾代碼塊
synchronized(this){} //修飾當前類
synchronized(類.class){}//修飾其他類
//修飾方法
1.修飾靜態(tài)方法
2.修飾非靜態(tài)方法
案例代碼:
class Thick implements Runnable
{
private int num=10;
Boolean flag=true;
@Override
public void run()
{
try {
buy();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
public void buy() throws InterruptedException {
while (flag)
{
Thread.sleep(200);
if (num>0)
synchronized (this)
{
System.out.println(Thread.currentThread().getName()+"買到了第"+num--+"票");
}
else
{
flag=false;
}
}
}
public class CarThick {
public static void main(String[] args) {
Thick thick=new Thick();
new Thread(thick,"張三").start();
new Thread(thick,"李四").start();
new Thread(thick,"王二狗").start();
}
}
12.死鎖
13.Lock鎖
和synchronized
鎖的作用一樣,在線程同步的情況下,保證數(shù)據(jù)的原子性
ReentrantLock//可重入鎖
private final ReentrantLock lock=new ReentrantLock();
lock.lock();//加鎖,在數(shù)據(jù)發(fā)生改變的地方,加鎖
lock.uplock;//解鎖,完成數(shù)據(jù)改動后,把鎖給下一個線程
14.生產(chǎn)者與消費者-線程通信
1.生產(chǎn)者
2.消費者
3.線程池
4.消費品
管程法文章來源:http://www.zghlxwxcb.cn/news/detail-672060.html
//線程池
class SynContainer{
// 需要一個容器大小
Bug[] bugs = new Bug[10];
// 容器計算器
int count = 0;
// 生產(chǎn)者放入bug
public synchronized void push(Bug bug){
// 如果容器滿了,就需要等待消滅bug
if(count==bugs.length){
// 通知消滅bug者消滅,生產(chǎn)bug等待
try {
//導致當前線程等待,直到另一個線程調(diào)用該對象的 notify()方法或 notifyAll()方法。
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 如果沒有滿,我們就需要繼續(xù)生產(chǎn)bug
bugs[count] = bug;
count++;
// 可以通知消滅者消滅了
this.notifyAll();
// notifyAll喚醒正在等待對象監(jiān)視器的所有線程。
}
// 消滅者消滅bug
public synchronized Bug pop(){
// 判斷能否消滅
if (count == 0){
// 等待生產(chǎn)者生產(chǎn),消滅者等待
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 如果可以消滅
count--;
Bug bug = bugs[count];
// 消滅完了,通知生產(chǎn)者生產(chǎn)
this.notifyAll();
try {
System.out.println("通知生產(chǎn)者");
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
return bug;
}
//生產(chǎn)者
class Productor extends Thread{
SynContainer container;
public Productor(SynContainer container){
this.container = container;
}
// 生產(chǎn)
@Override
public void run() {
for (int i = 0; i <=100; i++) {
container.push(new Bug(i));
System.out.println("生產(chǎn)了"+i+"個bug");
}
}
}
//消費者
class Consumer extends Thread{
SynContainer container;
public Consumer(SynContainer container){
this.container = container;
}
@Override
public void run() {
for (int i = 0; i <= 100; i++) {
System.out.println("消滅了-->"+container.pop().id+"個bug");
}
}
}
//消費品
class Bug{
int id;// bug編號
public Bug(int id){
this.id = id;
}
}
//測試
public class ProviderAndConsumer
{
public static void main(String[] args) {
SynContainer container = new SynContainer();
new Productor(container).start();
new Consumer(container).start();
}
}
15.線程池
避免重復的創(chuàng)建銷毀線程,減少資源浪費,類似于數(shù)據(jù)庫連接池文章來源地址http://www.zghlxwxcb.cn/news/detail-672060.html
到了這里,關(guān)于多線程知識點的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!