1,Thread.yield()方法可以提醒線程調度器去執行別的線程;
2,ExecutorService exec = Executors.newCachedThreadPool();
exec.execute(實現runable接口的類);
exec.shutdown();代表當前線程池在shutdown方法調用後將拒絕添加新的任務,但之前添加的任務仍然照常執行。
2,ExecutorService exec = Executors.newFixedThreadPool(5);
創建一個有邊界的線程池,省去了上面線程池創建線程的時間,這個線程池會初始化時就創建所有線程。
3,ExecutorService exec = Executors.newSingleThreadExecutor();
創建一個單線程的線程池,本質即一個線程的FixedThreadPool,加入到該線程池中的任務會排隊執行。
4,class TaskWithResult implements Callable{}
List<Future<String>> results = new ArrayList();
results.add(exec.submit(new TaskWithResult()));
ExecutorService執行submit方法返回Future,Future可以執行isDone方法判斷該線程是否結束,調用get方法會阻塞,一直等到該線程返回值。
5,TimeUnit.MILLISECONDS.sleep(100);這個方法代替之前Thread.sleep();
6,通過修改線程優先級:Thread.currentThread().setPriority()可以設置優先級,優先級高的理論上會被多執行。
7,後臺線程的概念:線程默認是非後臺的,因爲後臺線程並不能阻止程序退出,即在main方法中開啓多個後臺線程,main方法結束後,多個後臺線程不管是否執行完,都結束。後臺線程可以通過setDaemon(true)設置。
8,synchronized:非靜態方法是鎖當前對象,靜態方法是鎖類,給代碼塊加鎖:鎖定某個對象。
Lock lock = new ReenTrantLock();lock.lock;在finally中添加代碼lock.unlock();
9,volatile保證變量可見性,有序性。但並不能保證線程安全。可能存在還剩4張票,多個線程執行i—後可能,還剩3張票。
10,原子類:這種類保證了,不用加鎖,就可以保證線程安全。
11,synchronized關鍵字加到非靜態方法上,一個對象被多個線程調用,這個對象的多個加鎖的方法是互斥的。
多個對象被多個線程調用,加鎖的方法是互不影響的。
synchronized關鍵字加到靜態方法上,多個線程中用類調用加鎖靜態方法,互斥的。
這個類的某個對象在多個線程中,調用加鎖的靜態或非靜態方法,互斥的。
多個線程中使用一個對象,有的調用加鎖靜態方法、有的調用加鎖非靜態方法,不會互斥。