標籤:set out 開始 amp img 元素 void settings 多進程
線程是比進程更小的執行單位,是在進程基礎上進行的進一步劃分。所謂多線程是指進程在執行過程中可以產生多個同時存在、同時啟動並執行線程。多進程機制可以合理利用資源,提高程式的運行效率。一個進程至少包含一個線程(JVM虛擬機器的啟動是多線程的,至少有兩個線程:main 和記憶體回收機制)。
1、什麼是安全執行緒?
進程在運行時為了更好的利用資源提高運行效率,會產生多個線程,但是這多個線程運行時,會對同一個資源同時進行操作,也稱之為線程非同步,例如:線程A,B在對同一個鏈表進行操作時,如果出現了A對鏈表進行讀取的同時,線程B同時對其進行寫入資料。顯然這樣是非常不好的。那麼就需要線程同步。
2、何為線程同步?
線程同步:通俗而言就是,當線程A在對某一資源進行操作時,那麼線程B以及其他線程就必須等待,此時不能對這一資源進行操作。即線程A、B按照預定的計劃對這一資源進行非同時訪問。
3、安全執行緒:對於線程非同步,這樣的線程在運行時是不安全的,所以就引進同步。
//java中實現多線程有兩種方法,繼承自Thread類,實現Runnable介面。
//1 繼承自Thread介面需要實現run方法,
public class ThreadDemo extends Thread{
private String name;
public ThreadDemo(String name){
this.name=name;
}
//重寫Thread類中的run方法
public void run(){
for(int i=0;i<=10;i++){
System.out.println(name+"運行i="+i);
}
}
public static void main(String [] name){
new ThreadDemo("線程A").start();
new ThreadDemo("線程B").start();
}
}
結果證明:線程A,B交錯運行。
public class RunnableDemo implements Runnable{
private String name;
public RunnableDemo(String name){
this.name=name;
}
@Override
public void run() {
for(int i=1;i<=15;i++){
System.out.println(name+"運行i="+i);
}
}
public static void main(String [] args){
RunnableDemo demo1=new RunnableDemo("線程A");
RunnableDemo demo2=new RunnableDemo("線程B");
Thread thread1=new Thread(demo1);//執行個體化Thread類
Thread thread2=new Thread(demo2);//執行個體化Thread類
thread1.start();//啟動線程
thread2.start();//啟動線程
}
}
//注意啟動多線程必須使用Thread類實現
Thread類與Runnable介面的區別,如果繼承自Thread類,不適合多個線程共用資源,而實現了Runnable介面可以方便的實現資源共用。
public class ThreadDemo2 extends Thread{
private String name;
private int ticket=15;
public void run(){
for(int i=0;i<=15;i++){
if(ticket>0){
System.out.println(name+"賣票:ticket="+ticket--);
}
}
}
public ThreadDemo2(String name){
this.name=name;
}
public static void main(String[] args){
ThreadDemo2 demo1=new ThreadDemo2("線程A");
ThreadDemo2 demo2=new ThreadDemo2("線程B");
ThreadDemo2 demo3=new ThreadDemo2("線程C");
new Thread(demo1).start();
new Thread(demo2).start();
new Thread(demo3).start();
}
}
//結果證明線程A,B,C都各自賣出15張票
public class RunnableDemo2 implements Runnable{
private int ticket=10;
public void run() {
for(int i=1;i<=5;i++){
if(ticket>0){
System.out.println("賣票:ticket="+ticket--);
}
}
}
public static void main(String[] args) {
RunnableDemo2 demo1=new RunnableDemo2();
new Thread(demo1).start();
new Thread(demo1).start();
new Thread(demo1).start();
}
}
//結果如下:賣票:ticket=10
賣票:ticket=9
賣票:ticket=8
賣票:ticket=7
賣票:ticket=6
賣票:ticket=5
賣票:ticket=4
賣票:ticket=3
賣票:ticket=2
賣票:ticket=1
實現Runnable介面與繼承自Thread類在實現多線程中相比具備以下優勢
(1) 適合多個具有相同程式碼的線程處理同一資源
(2)避免java單繼承特徵帶來的局限
(3)代碼能夠被多個線程共用且資料獨立存在,從而增強了程式的健壯性。
4、線程同步
同步是指同一時間段內只能運行一個線程,其他線程需要等待此線程完成後才可繼續執行。同步可以解決線程中資源共用的安全問題,主要有同步代碼塊和同步方法兩種方式完成。
1)同步代碼塊格式
synchronized(同步對象){
需要同步的代碼塊
}
public class SynchronizedDemo implements Runnable{
private int ticket=5;
public void run() {
for(int i=1;i<=5;i++){
synchronized (this) {
if(ticket>0){
try{
Thread.sleep(1000);
}catch(Exception e){
e.printStackTrace();
}
System.out.println("賣票:ticket="+ticket--);
}
}
}
}
public static void main(String[] args) {
SynchronizedDemo demo1=new SynchronizedDemo();
new Thread(demo1).start();
new Thread(demo1).start();
new Thread(demo1).start();
}
}
結果如下:
賣票:ticket=5
賣票:ticket=4
賣票:ticket=3
賣票:ticket=2
賣票:ticket=1
如果沒有加入線程同步方法,則賣票會出現負數
另外有同步方法
格式如下:
synchronized 方法傳回型別方法名稱(參數列表){
}
5、線程的生命週期/
1)建立狀態
2)就緒狀態
3)運行狀態
4)阻塞狀態
5)終止狀態
6、加入js的理解
先看一段代碼
var x = document.getElementsByName(data);var i;for (i = 0; i < x.length; i++) { var value=x[i].id; $.getJSON(ctx + ‘/sys/dict/description‘, { value: value }, function (data) { var str = ‘ <img src="/static/images/toolbox/description.png" title="‘+data.value+‘"/>‘; $(‘.tooltip-description [desc=‘+value+‘]‘).append(str); });
本段代碼的意圖是根據元素名取得頁面上所有元素,然後逐個發送請求到後台,將根據該得到的資料在頁面上進行展示,代碼中,for迴圈應是一個原子操作,但$.getJSON()是非同步請求資料,第一個請求還沒結束,第二個就已經開始,導致資料混亂,因此應對for迴圈進行修改,使其變為安全執行緒,具體做法是在for迴圈之前加一段代碼:
var x = document.getElementsByName(data);var i;$.ajaxSettings.async = false; for (i = 0; i < x.length; i++) { var value=x[i].id; $.getJSON(ctx + ‘/sys/dict/description‘, { value: value }, function (data) { var str = ‘ <img src="/static/images/toolbox/description.png" title="‘+data.value+‘"/>‘; $(‘.tooltip-description [desc=‘+value+‘]‘).append(str); });
什麼是java的安全執行緒?同步,非同步