佳哥?文濤???
單線(xiàn)程
/**
* 并行:兩個(gè)或多個(gè)事件在 同一時(shí)間發(fā)成 同時(shí)發(fā)生 兩個(gè)CPU 執(zhí)行兩個(gè)任務(wù)
* 并發(fā):兩個(gè)或多個(gè)事件 在同一時(shí)間段執(zhí)行 一個(gè)cpu交替執(zhí)行
*
* 內(nèi)存 所有的應(yīng)用程序都會(huì)到內(nèi)存中
* 線(xiàn)程 一個(gè)進(jìn)程包含多個(gè)線(xiàn)程 列如:電腦管家里面的功能就是加速 清理 病毒查殺
* (cpu中央處理器 對(duì)數(shù)據(jù)進(jìn)行計(jì)算 amd inter) 線(xiàn)程是進(jìn)程中的一個(gè)執(zhí)行單元
* 進(jìn)程 進(jìn)入大內(nèi)存中的程序就是進(jìn)程 idea 微信
*
* java 搶占式調(diào)度 高度切換 誰(shuí)的優(yōu)先級(jí)高 誰(shuí)先執(zhí)行
* 主線(xiàn)程 執(zhí)行主方法的線(xiàn)程
*/
public class Demo {
//主線(xiàn)程 程序從main方法先執(zhí)行
? ? public static void main(String[] args) {//Jvm執(zhí)行main方法進(jìn)入棧內(nèi)存 main方法通向cpu的路徑
? ? ? ? Person person =new Person("周一");
person.run();//單線(xiàn)程的異常
? ? ? ? Person person1 =new Person("周二");
person1.run();
}
}
多線(xiàn)程


多線(xiàn)程直接互不影響
獲取線(xiàn)程名稱(chēng)System.out.println(Demo.currentThread().getName());? ? 線(xiàn)程名稱(chēng)setName();==new MyThread(“線(xiàn)程名稱(chēng)").start? ? ? ?
thread?常用方法sleep當(dāng)前毫秒值內(nèi)睡眠
實(shí)現(xiàn)接口方式創(chuàng)建多線(xiàn)程

public class Test {
public static void main(String[] args) {
/*
Runnable runnable = new Runnable();
Thread thread = new Thread(runnable);
thread.start();
for (int i = 0; i <20 ; i++) {
System.out.println(Thread.currentThread().getName()+"-->"+i);
}*/
? ? ? ? //匿名內(nèi)部類(lèi) 多線(xiàn)程? 父類(lèi)是Thread 調(diào)用run
/*new Thread(){
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName() +"-->"+i);
}
}
}.start();*/
? ? ? ? //匿名內(nèi)部類(lèi)實(shí)現(xiàn)接口的方式
? ? ? ? java.lang.Runnable runnable =new java.lang.Runnable() {
@Override
? ? ? ? ? ? public void run() {
for (int i =0; i <10 ; i++) {
System.out.println(Thread.currentThread().getName()+"-->"+i);
}
}
};
new Thread(runnable).start();
}
}
線(xiàn)程安全問(wèn)題? 電影售票的問(wèn)題(共享數(shù)據(jù)會(huì)產(chǎn)生安全問(wèn)題?按個(gè)窗口同時(shí)賣(mài)一些票) 多線(xiàn)程處理?三種方式處理現(xiàn)成安全的問(wèn)題
public class Synchronuzedimplements java.lang.Runnable {
private int ticket=50;
// 使用鎖 防止線(xiàn)程安全 創(chuàng)建鎖對(duì)象lock unlock
? ? Lockl=new ReentrantLock();
@Override
? ? public void run() {
while (true){
pickTicket();
}
}
//使用同步方法
? ? //還有靜態(tài)的同步方法 直接在synchronized前面加Static
/* public synchronized void pickTicket(){
l.lock();
if (ticket>0){
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
? ? ? ? ? ? System.out.println(Thread.currentThread().getName()+"售票"+ticket);
ticket--;
}
? ? ? ? //釋放鎖 所可以放在finally里面l.unlock();
}*/
? //unlock 放在finally里面
? public synchronized void pickTicket(){
l.lock();
if (ticket>0){
try {
Thread.sleep(10);
System.out.println(Thread.currentThread().getName()+"售票"+ticket);
ticket--;
}catch (InterruptedException e) {
e.printStackTrace();
}finally {
//釋放鎖 所可以放在finally里面
? ? ? ? ? ? ? ? l.unlock();//正常的三個(gè)線(xiàn)程同時(shí)搶占cPU
? ? ? ? ? ? }
}
}
}
main??public class SynchronuzedMain {
public static void main(String[] args) {
Synchronuzed synchronuzed =new Synchronuzed();
Thread thread1 =new Thread(synchronuzed);
Thread thread2 =new Thread(synchronuzed);
Thread thread3 =new Thread(synchronuzed);
thread1.start();
thread2.start();
thread3.start();//(同步方法時(shí))只可以一個(gè)線(xiàn)程執(zhí)行
? ? }
}
線(xiàn)程的狀態(tài)?阻塞狀態(tài)()(?主動(dòng)放棄cpu休眠狀態(tài)?無(wú)線(xiàn)等待狀態(tài)? )新建?運(yùn)行? 死亡
TimeWating?計(jì)時(shí)等待? ? notity?如果有多個(gè)線(xiàn)程等待?隨機(jī)喚醒一個(gè)線(xiàn)程
notityAll喚醒所有等待的線(xiàn)程
/**
* 等待喚醒案例
* 消費(fèi)者 需要什么樣的包子 要告訴生產(chǎn)者 生產(chǎn)者做 所以消費(fèi)者需要等待wating5秒中(sleep(5000))
* 生產(chǎn)者 做包子 做完包子要喚醒notity消費(fèi)者 告訴他可以吃包子了
*
* 通用包子 作為類(lèi)Baozi
* 我們需要用到同步代碼 保證和等待喚醒的是一個(gè)線(xiàn)程 同步技術(shù)
*
* */
public class Wating {
public static void main(String[] args) {
//創(chuàng)建鎖對(duì)象 保證唯一
? ? ? ? Object object =new Object();
//創(chuàng)建一個(gè)消費(fèi)者
? ? ? ? new Thread(){
@Override
? ? ? ? ? ? public void run() {
//消費(fèi)者告訴生產(chǎn)者 要什么樣的包子
? ? ? ? ? ? ? // Baozi baozi = new Baozi("紫色","剝皮");
? ? ? ? ? ? ? ? //一直等著買(mǎi)包子
? ? ? ? ? ? ? ? while (true){
synchronized (object){
System.out.println("告知生產(chǎn)者要的包子種類(lèi) 數(shù)量");
//開(kāi)始等待包子做好
? ? ? ? ? ? ? ? ? ? ? ? try {
object.wait();
}catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("喚醒之后 可以吃包子了");
}
}
}
}.start();
//匿名對(duì)象 線(xiàn)程 創(chuàng)建一個(gè)生產(chǎn)者
? ? ? ? new Thread(){
@Override
? ? ? ? ? ? public void run() {
while (true){
try {
Thread.sleep(5000);
}catch (InterruptedException e) {
e.printStackTrace();
}
//同步技術(shù)
? ? ? ? ? ? ? ? ? ? synchronized (object){
System.out.println("用了5秒做完了包子 告訴消費(fèi)者可以吃包子了");
//喚醒他
? ? ? ? ? ? ? ? ? ? ? ? object.notify();
}
}
//生產(chǎn)者 花了5秒做包子
? ? ? ? ? ? }
}.start();
}
}
等待與喚醒機(jī)制?線(xiàn)程間的通信? (生產(chǎn)包子?吃包子)多個(gè)線(xiàn)程之間的協(xié)作機(jī)制 有效的利用資源 (生產(chǎn)一個(gè)包子?吃一個(gè)包子)
線(xiàn)程池?頻繁的創(chuàng)建線(xiàn)程降低效率?可以用線(xiàn)程池來(lái)達(dá)到效果
線(xiàn)程池?的底層原理?一個(gè)容器-> 集合?hashMap?Arraylist hashset LinkedList(常用)-->? ? 容器有很多線(xiàn)程?
程序第一次啟動(dòng)?創(chuàng)建多個(gè)線(xiàn)程保存到一個(gè)集合中? 使用線(xiàn)程時(shí)? 從集合中取出來(lái)?remove方法?返回的是被移除的元素?線(xiàn)程只能被一個(gè)任務(wù)使用? ?
removeFirst移除第一個(gè)線(xiàn)程?使用完畢?需要把線(xiàn)程歸還給線(xiàn)程池?list.add添加?隊(duì)列的思想?線(xiàn)程排隊(duì)
java5?線(xiàn)程池?
