編輯:關於Android編程
對於許多多線程的問題,其實是可以通過使用一個或多個隊列以安全的方式將其形式化的,即使用隊列可以安全的從一個線程
向另一個線程傳輸數據。其中阻塞隊列就是一種很有用的工具,工作者線程可以周期性的將中間結果存儲在阻塞隊列中,而其他工作者
線程則可以移出中間結果並進行加以修改,而且在其運行的同時隊列還會自動的平衡負載。
-----------YYC
本部分則以用阻塞隊列的方式解決生產者和消費者問題來作為具體實例進行說明。生產者線程向隊列中插入元素,消費者線程
則從中取出它們,特別是當試圖向隊列中添加元素而隊列已滿,或者想從隊列中移出元素而隊列為空的時候,阻塞隊列則會導致當前的
這個隊列阻塞。
For Example:
//先定義生產者和消費者類
class Producer implements Runnable { private final BlockingQueue sharedQueue; public Producer(BlockingQueue sharedQueue) { this.sharedQueue = sharedQueue; } @Override public void run() { for(int i=0; i<10; i++){ try { System.out.println("Produced: " + i); sharedQueue.put(i); //如果該隊列已滿則會自動阻塞該線程 //如果該線程在阻塞的過程中被中斷則會發生中斷異常 } catch (InterruptedException ex) { Logger.getLogger(Producer.class.getName()).log(Level.SEVERE, null, ex); } } } } class Consumer implements Runnable{ private final BlockingQueue sharedQueue; public Consumer (BlockingQueue sharedQueue) { this.sharedQueue = sharedQueue; } @Override public void run() { while(true){ try { System.out.println("Consumed: "+ sharedQueue.take()); //如果該阻塞隊列為空則會自動阻塞該線程 } catch (InterruptedException ex) { Logger.getLogger(Consumer.class.getName()).log(Level.SEVERE, null, ex); break; } } } }
case R.id.button3://阻塞隊列實現生產者和消費者模式 BlockingQueue sharedQueue = new LinkedBlockingQueue();//容量沒有上界的阻塞隊列 Thread prodThread = new Thread(new Producer(sharedQueue)); Thread consThread = new Thread(new Consumer(sharedQueue)); prodThread.start(); consThread.start(); break;在JAVA的concurrent包中其實是提供了阻塞隊列的幾個變種的,上面的代碼中選擇的是LinkedBlockingQueue型,這種隊列的默認容量是沒有
上界的,但是,也可以自己手動的設置最大容量。此外還有LinkedBlockingDeque型這是一個雙端隊列版本、ArrayBlockingQueue是可以用來設置是否需要公平性的隊列、PriorityBlockingQueue是一種帶優先級的隊列,而不是簡單的先進先出的隊列,元素會按照他們的優先級順序被移出,該類型也是沒有容量
上限的。
今天,我們就來談下android中圖片的變形的特效,在上講博客中我們談到android中圖片中的色彩特效來實現的。改變它的顏色主要通過ColorMatrix類來實現。現在
設置兩張圖片重疊的模式。在正常的情況下,在已有的圖像上繪圖將會在其上面添加一層新的形狀。如果新的Paint是完全不透明的,那麼它將完全遮擋住下面的Paint;如果它是部分
Google在2015的IO大會上,給我們帶來了更加詳細的Material Design設計規范,同時,也給我們帶來了全新的Android Design Support
一、前言在之前的破解過程中可以看到我們唯一離不開的一個神器那就是apktool了,這個工具多強大就不多說了,但是如果沒有他我們沒法涉及到後面的破解工作了,這個工具是開源的