1. 程式人生 > >【JAVA】基礎:執行緒、IO流、如何打包成可安裝 exe 程式

【JAVA】基礎:執行緒、IO流、如何打包成可安裝 exe 程式

1.執行緒

程序是一個可以獨立執行的程式單位,執行緒就是一個輕量級的程序。
自定義執行緒的方法:
1.繼承Thread類,重寫Thread類中的run方法,建立繼承類物件,呼叫執行緒的start()方法。
在這裡插入圖片描述

2.實現Runnable介面,重寫run方法,建立實現類物件,建立執行緒類物件,呼叫執行緒的start()方法。
在這裡插入圖片描述

執行緒的5種狀態:
新建、就緒、執行、阻塞、結束
當我們建立一個執行緒物件的時候,該執行緒就進入新建狀態,當我們呼叫執行緒的start方法,執行緒進入就緒狀態,等待CPU分配時間片執行,當獲取到 CPU時間片的時候,程式碼開始執行,進入執行狀態。當執行時候我們呼叫sleep、join、yeild、join,還有其他一些方式導致改程式暫停執行就進入了阻塞狀態,當阻塞結束後又進入就緒狀態,然後進入執行狀態,程式執行完成後該執行緒進入結束狀態,然後等到CPU回收該記憶體。
執行緒方法詳解:
1、setPriority(int newPriority)設定執行緒優先順序,我們可以通過此方法設定執行緒的優先順序,優先順序越高獲取時間片的概率就越大。
2、join() join(long millis) join(long millis, int nanos) ,執行緒合併,合併外部的執行緒,然後等待外部執行緒執行完畢後,在執行當前執行緒。
3、yield方法,就是執行緒讓行的意思,本來該我獲取時間片了,但是我不獲取,讓給別人去獲取,我在獲取下一次
4、wait和notify
wait方法:
wait()和wait(timeout) 第一個是一直進入等待狀態, 第二個是進入等待狀態,到時間自己往下 notify 和我們的wait是組合使用:

synchronized (Account.o) { 
System.out.println(“輸入密碼”); 
if( Account.balence>=200) { 
System.out.println(name + “取錢200走了”); 
Account.balence -= 200; 
}else { 
System.out.println(name + “餘額不足!沒法取錢”); 
}

try { 
Account.o.wait(); 
} catch (InterruptedException e) { 
// TODO Auto-generated catch block 
e.printStackTrace(); 
}

while(true) {
1
try { 
Thread.sleep(10000); 
} catch (InterruptedException e) { 
// TODO Auto-generated catch block 
e.printStackTrace(); 
} 
synchronized (Account.o) { 
Account.o.notify(); 
}

} 

Thread本身提供了一個stop方法,但是這個方法很不安全,我們不推薦使用這個方法,因為一般的執行緒都是一個迴圈體, 所以我們通過標誌位 來結束迴圈達到結束執行緒目的

多執行緒:
多執行緒是一個程序中同時有多個執行緒正在執行。
在一個程式中,有很多操作是非常耗時的,如資料庫的讀寫,IO操作等,如果用單執行緒就必須把這些操作執行完成後才能進行下面的操作,而用了多執行緒以後,就可以把這些程式放在後臺的繼續執行,同時執行其他的操作。可以提高程式的效率。多執行緒在高併發問題中可以充分利用計算機資源。

執行緒併發:所謂的執行緒併發就是當我們多個程式操作同一個資源的時候,會造成資源重複操作。
解決方案就是加鎖,synchronized 另外一種方式是佇列

類鎖:

synchronized (Ren.class) {
            System.out.println("輸入密碼");
            if( Account.balence>=200) {
                System.out.println(name + "取錢200走了");
                Account.balence -= 200;
            }else {
                System.out.println(name + "餘額不足!沒法取錢");
            }

            System.out.println("取錢結束,餘額為:" + Account.balence);

        }

物件鎖:

  public void run() {
            synchronized (Account.o) {
                System.out.println("輸入密碼");
                if( Account.balence>=200) {
                    System.out.println(name + "取錢200走了");
                    Account.balence -= 200;
                }else {
                    System.out.println(name + "餘額不足!沒法取錢");
                }
    
                System.out.println("取錢結束,餘額為:" + Account.balence);
    
            }
        }

方法鎖:

public synchronized void run() {
            System.out.println("輸入密碼");
            if( Account.balence>=200) {
                System.out.println(name + "取錢200走了");
                Account.balence -= 200;
            }else {
                System.out.println(name + "餘額不足!沒法取錢");
            }

            System.out.println("取錢結束,餘額為:" + Account.balence);
    }

執行緒非同步:所謂的非同步就是多個執行緒同時操作,有可能會操作到同一個資源,這樣就會形成我們的資源誤操作,這種方式效率高,速度快,不安全,容易資源誤操作 。
執行緒同步:多個執行緒一起執行,但是後面的執行緒必須等前面的執行緒執行完成以後才能執行,效率低下,速度慢,安全。

2.IO流

在這裡插入圖片描述
IO流技術主要是解決資料儲存到硬碟的操作
一種叫做寫到硬碟上 : output
一種從硬碟讀取::input
IO流就是操作資料的兩種方式

輸入流,InputStream == >FileInputStream

package com.test.io1;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

/**
 * 在E盤下   建立檔案路徑如下  E:/file/src/info.txt;
 * @author Administrator
 */
public class TestIo {

    public static void main(String[] args) {

        //檔案輸入流
        String num = "0";

        try {
//          FileInputStream fis = new FileInputStream("E:/info.txt");

            File file = new File("E:/info.txt");
            FileInputStream fis = new FileInputStream(file);

            byte b[] = null;
            try {
                System.out.println(fis.available());
                b = new byte[fis.available()];
            } catch (IOException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
            try {
                fis.read(b);
                String s = new String(b);
                System.out.println(s);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }


        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

}

資料夾以及檔案的建立類: File(注意需要先建立資料夾再建立檔案)

package com.test.io1;

import java.io.File;
import java.io.IOException;

public class TestFile {

    public static void main(String[] args) {
        //建立資料夾
        File file = new File("E:/file/src");
        file.mkdirs();

        //建立檔案
        File file2 = new File("e:/file/src/info.txt");
        try {
            file2.createNewFile();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

java物件流,存取物件:
ObjectInputStream、FileOutputStream。 儲存的是java的物件形式的資料,前提是該物件的類必須被序列化
public class Map implements Runnable, Serializable{

}

字串流:
java字元流是Reader、Writer、通過我們查詢API發現,該字串流是無法直接獲取硬碟檔案的,需要藉助我們的位元組輸入流和位元組輸出流來進行檔案獲取,所以程式碼如下:

try {
            //利用位元組流關聯檔案
            InputStream is = new FileInputStream("e:/a.txt");
            //將位元組流套入我們基礎字元流
            InputStreamReader isr = new InputStreamReader(is);
            //將基礎字元流套入高階字元流
            BufferedReader br = new BufferedReader(isr);

            System.out.println(br.readLine());
        } catch (Exception e) {
            // TODO: handle exception
        }



try {
            OutputStream os = new FileOutputStream("e:/a.txt",true);
            OutputStreamWriter osw = new OutputStreamWriter(os);
            BufferedWriter bw = new BufferedWriter(osw);

            bw.write("張三你好");

            bw.close();
            osw.close();
            os.close();
        } catch (Exception e) {
            // TODO: handle exception
        }

3.如何打包成可安裝 exe 程式

第一步:把java檔案打包成class檔案包,把java工程打包成jar檔案

直接利用eclipse完成打包:

專案右鍵 – export – 依次操作

完成之後我們會得到一個jar檔案,這個jar檔案就是我們java編譯過後的class的壓縮包

第二步: 把jar檔案打包成可執行的exe。 需要利用exe4j工具。
官網下載地址:https://exe4j.apponic.com/

第三步:把可執行的exe打包成可安裝exe,需要利用inno setup軟體進行打包,注意,這個然間使用很複雜, 所以操作的時候注意每一步的細節。