30 Kasım 2017 Perşembe

StreamEx

Giriş
StreamEx sınıfı dışında IntStreamEx gibi özelleşmiş sınıflar da var.



joining metodu
Bu metod ile .collect(Collectors.X()) gibi çağrılar yapmaya gerek yok. 

pairMap metodu
Stream'deki yanyan iki nesnesi belirtilen fonksiyona verir.
Örnek
Pair nesnesi oluşturmak için şöyle yaparız.
Stream<Pair> pairs = StreamEx.of(stream).pairMap(Pair::new);
toList metodu
Bu metod ile .collect(Collectors.X()) gibi çağrılar yapmaya gerek yok.

groupingBy metodu
Bu metod ile .collect(Collectors.X()) gibi çağrılar yapmaya gerek yok. 


29 Kasım 2017 Çarşamba

Selector Sınıfı

Giriş
Şu satırı dahil ederiz.
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
Genellikle bu sınıfı süren yani select() metodunu çağıran 1 veya daha fazla thread bulunur.

Bu sınıfa verilen socket nesnelerinin non-blocking olması gerekir. Yani şöyle yaparız.
ServerSocketChannel serverChannel = ...;
serverChannel.configureBlocking(false);
Channel'dan SelectionKey'e erişmek için şöyle yaparız.
SocketChannel channel = ...;
SelectionKey key = channel.keyFor (selector);
close metodu
Örnek ver

keys metodu
Açıklaması şöyle
"Returns this selector's key set. The key set is not directly modifiable. A key is removed only after it has been cancelled and its channel has been deregistered. Any attempt to modify the key set will cause an UnsupportedOperationException to be thrown. The key set is not thread-safe."
open metodu
Şöyle yaparız.
Selector selector = Selector.open();
select metodu
Genelde bir döngü için şöyle kullanılır. "Ready" olan key sayısını döner. Şöyle yaparız.
while (true) {
  selector.select();

  Set<SelectionKey> keys = selector.selectedKeys();
  for (SelectionKey key : keys) {

    SelectableChannel channel = key.channel();

    if (key.isAcceptable())    {...}
    else if (key.isWritable()) {...}
    else if (key.isReadable()) {...}
    }   
}
selectedKeys metodu
Açıklaması şöyle. selectedKey() her zaman keys() metodunun alt kümesini döndürür.
"Returns this selector's key set. The key set is not directly modifiable. A key is removed only after it has been cancelled and its channel has been deregistered. Any attempt to modify the key set will cause an UnsupportedOperationException to be thrown. The key set is not thread-safe."
Şöyle yaparız. key'ler ile ilgili yapılabilecek işlemker için SelectionKey Sınıfı'na bakınız.
Set readyKeys = selector.selectedKeys();
Iterator it = readyKeys.iterator();  
while (it.hasNext()) {
  SelectionKey key = (SelectionKey )it.next();
  if (key.isReadable()) {
    ...
  }
  it.remove();
}
Döngüdeki remove() çağrısıının açıklaması şöyle
Notice the keyIterator.remove() call at the end of each iteration. The Selector does not remove the SelectionKey instances from the selected key set itself. You have to do this, when you are done processing the channel. The next time the channel becomes "ready" the Selector will add it to the selected key set again.
selectNow metoud
Şöyle yaparız.
Selector selector = ...;

if (selector.selectNow() != 0) {
  ...
}
wakeUp metodu
Selector select() metodu içinde bloke olmuş iken yeni bir SelectableChannel eklenirse,kapatılırsa vs. select() çağrısından çıkarmak için kullanılır.
Örnek ver

Diğer
Gördüğüm bir gerçekleştirimde bu sınıf sarmalanıyordu. Okuma ve yazma işlemi için kuyruklar tutuluyordu.
Map <SocketChannel ,Queue <ByteBuffer>> outgoingData = ...;
ByteBuffer incomingData =...
Gönderilecek veri kuyrupa ekleniyor ve channel için SelectionKey.OP_WRITE işlemi başlatılıyor.
Socket müsait olunca yazma işlemi başlıyor ve tüm veri döngü içinde gönderilmeye çalışılıyor. Yazma işlemi bitince map boş ise SelectionKey.OP_READ başlatılıyor.

Okuma işleminde incomingData temizleniyor ve okuma işlemi yapılıyor. Bu veri daha sonra hemen bir işlenmek üzere bir kuyruğa konuluyor. Kuyruk şöyle
BlockingQueue<NetworkEvent > eventQueue = ...;




23 Kasım 2017 Perşembe

Runtime Sınıfı

Giriş
Runtime sınıfı erişilebilir bir constructor vermiyor. getInstance () çağrısı ile nesneyi yaratıyoruz.

addShutdownHook metodu
Şöyle yaparız.
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
  ...
  executorPool.shutdown();
  logger.info("Shutdown executorPool");
}));
availableProcessors metodu
Şöyle yaparız.
Runtime.getRuntime().availableProcessors();
exec metodu
Java kullanarak bir başka uygulamayı çalıştırmak için Runtime.exec() veya ProcessBuilder sınıfını kullanmak lazım. Her iki sınıf ta Process nesnesi ürettiği için geri kalan işlemler aslında hemen hemen aynı.

Runtime.exec() hata olursa exception atmaz. Process.exitValue() veya Process.getInputStream() metodları ile hatayı anlamak mümkün olabilir.

exec metodu - string
Örnek
ps komutu çalıştırmak için şöyle yaparız.
Process process = Runtime.getRuntime().exec("ps x");
Örnek - komut satırı
Şöyle yaparız.
Runtime run = Runtime.getRuntime();
Process pr = run.exec("cmd /c del /s/q c:\\mydirectory");
pr.waitFor();
Örnek - bat dosyası
Şöyle yaparız.
String filePath = "C:/test.bat";
Process p = Runtime.getRuntime().exec(filePath);
p.waitFor();        
exec metodu - string [] 

Örnek - array
Şöyle yaparız.
String[] cmd = ...;
Process p = Runtime.getRuntime().exec(cmd);
Örnek - pipe 
Şöyle yaparız.
String[] cmd = {
"/bin/sh",
"-c",
"ls /etc | grep release"
};

Process p = Runtime.getRuntime().exec(cmd);
exec - command + environment + working directory
Metodun imzası şöyle
exec(String[] cmdarray, String[] envp, File dir)
Üçüncü parametre uygulamanın "working directory" dizinini belirtir. Eğer null verilirse yeni uygulama kendisini yaratan uygulamanın "working directory" alanını kullanılır. 

Bat dosyasına "working directory" vermek için şöyle yaparız.
Runtime.exec("C:\mydir\myfile.bat", null, new File("C:\mydir"));
freeMemory metodu
Şöyle yaparız.
Runtime.getRuntime().freeMemory();
maxMemory metodu
Şöyle yaparız.
Runtime.getRuntime().maxMemory();
totalMemory metodu
Şöyle yaparız.
Runtime.getRuntime().totalMemory();