new Thread(new Runnable() {
public void run() {
System.out.println("Look ma, no hands");
}
}).start();
new Thread(new Runnable() {
public void run() {
System.out.println("Look at me, look at me...");
}
}).start();
Works just fine...
I'd prefer the use of an ExecutorService personally.
UPDATED with ExecutorService example
So I wrote this really quick example...
Basically it uses an ExecutorService
to run a couple of simple tasks. As it stands, both task will run in parallel with each other (simultaneously)
public static void main(String[] args) throws InterruptedException {
ExecutorService service = Executors.newFixedThreadPool(2);
service.submit(new PathScanner());
service.submit(new Counter());
service.shutdown();
service.awaitTermination(1, TimeUnit.DAYS);
System.exit(0);
}
public static class PathScanner implements Callable<Object> {
@Override
public Object call() throws Exception {
scan(new File("C:/"), 0);
return null;
}
protected void scan(File path, int deepth) {
if (deepth < 15) {
System.out.println("Scanning " + path + " at a deepth of " + deepth);
File[] files = path.listFiles();
for (File file : files) {
if (file.isDirectory()) {
scan(file, ++deepth);
}
}
}
}
}
public static class Counter implements Callable<Object> {
@Override
public Object call() throws Exception {
for (int index = 0; index < 1000; index++) {
Thread.sleep(1);
System.out.println(index);
}
return null;
}
}
Run it...
Now change ExecutorService service = Executors.newFixedThreadPool(2);
to ExecutorService service = Executors.newFixedThreadPool(1);
and run it again. Did you see the difference?
This is the way to control the number of simultaneously threads that executor can use while processing it's queue.
Make up some more tasks and add them to the queue and see what you get.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…