RotateThread.java example:
/*
* Copyright (c) CoralBlocks LLC (c) 2017
*/
package com.coralblocks.coralthreads.sample;
import java.util.List;
import com.coralblocks.coralbits.util.SystemUtils;
import com.coralblocks.coralthreads.Affinity;
import com.coralblocks.coralthreads.Processor;
public class RotateThread {
public static void main(String[] args) throws Exception {
class MyThread extends Thread {
private volatile boolean running = true;
private int procToBind = -1;
public MyThread(String name, int procToBind) {
super(name);
this.procToBind = procToBind;
}
public synchronized void changeProcToBind(int newProcToBind) {
this.procToBind = newProcToBind;
}
public void stopMe() {
this.running = false;
}
@Override
public void run() {
Affinity.bind();
int currProcToBind = procToBind;
try {
while(running) {
synchronized(this) {
if (currProcToBind != procToBind) {
Affinity.unbind();
Affinity.assignToProcessor(procToBind, this);
currProcToBind = procToBind;
Affinity.bind();
}
}
}
} finally {
Affinity.unbind();
}
}
}
List<Processor> procs = Affinity.getProcessors();
if (procs.isEmpty()) throw new RuntimeException("No processors were found!");
int procToBind = procs.get(0).getId();
MyThread t = new MyThread("RotatingThread", procToBind);
Affinity.assignToProcessor(procToBind, t); // start with the first one...
t.start();
System.out.println("Thread started on processor " + procToBind + "...");
int timePerProcInMillis = SystemUtils.getInt("timePerProcInSeconds", 10) * 1000;
for(int i = 1; i < procs.size(); i++) {
Thread.sleep(timePerProcInMillis);
int id = procs.get(i).getId();
System.out.println("Changing thread to processor " + id + "...");
t.changeProcToBind(id);
}
t.stopMe();
t.join();
}
}