Java : Thread (スレッド) - API使用例
Thread (Java SE 19 & JDK 19) の使用例まとめです。
だいたいのメソッドを網羅済みです。
API仕様のおともにどうぞ。
概要
Threadクラスは、スレッドを扱う低レイヤのAPIです。
きめ細やかなスレッドの制御が可能です。
しかし、一般的なプログラムでは、高レイヤのAPIである ExecutorService や Stream の paralellメソッドを使うことをおすすめします。
同期(synchronized)については「synchronizedの多いコードは危険信号」もご参照いただけたら幸いです。
final Runnable task = () -> {
System.out.println(" Run!");
final var current = Thread.currentThread();
System.out.println(" id : " + current.threadId());
System.out.println(" name : " + current.getName());
System.out.println(" priority : " + current.getPriority());
};
final var thread = new Thread(task, "name-A");
System.out.println("-- start --");
thread.start();
System.out.println("state : " + thread.getState());
thread.join();
System.out.println("-- join --");
System.out.println("state : " + thread.getState());
// 結果
// ↓
//-- start --
//state : RUNNABLE
// Run!
// id : 33
// name : name-A
// priority : 5
//-- join --
//state : TERMINATED
スレッドについては、上記の言語仕様も合わせてご確認ください。
フィールド
static final int MAX_PRIORITY
System.out.println(Thread.MAX_PRIORITY); // 10
static final int MIN_PRIORITY
System.out.println(Thread.MIN_PRIORITY); // 1
static final int NORM_PRIORITY
System.out.println(Thread.NORM_PRIORITY); // 5
コンストラクタ
Thread ()
class SampleThread extends Thread {
@Override
public void run() {
System.out.println("Run!");
System.out.println("name : " + getName());
System.out.println("priority : " + getPriority());
System.out.println("group : " + getThreadGroup().getName());
System.out.println("daemon : " + isDaemon());
}
}
final var thread = new SampleThread();
System.out.println("-- start --");
thread.start();
thread.join();
System.out.println("-- join --");
// 結果
// ↓
//-- start --
//Run!
//name : Thread-3
//priority : 5
//group : main
//daemon : false
//-- join --
Thread (Runnable task)
final Runnable task = () -> {
System.out.println("Run!");
final var current = Thread.currentThread();
System.out.println("current : " + current);
};
final var thread = new Thread(task);
System.out.println("-- start --");
thread.start();
thread.join();
System.out.println("-- join --");
// 結果
// ↓
//-- start --
//Run!
//current : Thread[#33,Thread-3,5,main]
//-- join --
Thread (Runnable task, String name)
final Runnable task = () -> {
System.out.println("Run!");
final var current = Thread.currentThread();
System.out.println("current : " + current);
};
final var thread = new Thread(task, "name-A");
System.out.println("-- start --");
thread.start();
thread.join();
System.out.println("-- join --");
// 結果
// ↓
//-- start --
//Run!
//current : Thread[#33,name-A,5,main]
//-- join --
Thread (String name)
final var thread = new Thread("name-A") {
@Override
public void run() {
System.out.println("Run!");
final var current = Thread.currentThread();
System.out.println("current : " + current);
}
};
System.out.println("-- start --");
thread.start();
thread.join();
System.out.println("-- join --");
// 結果
// ↓
//-- start --
//Run!
//current : Thread[#33,name-A,5,main]
//-- join --
Thread (ThreadGroup group, Runnable task)
final var group = new ThreadGroup("group-A");
final Runnable task = () -> {
System.out.println("Run!");
final var current = Thread.currentThread();
System.out.println("current : " + current);
};
final var thread = new Thread(group, task);
System.out.println("-- start --");
thread.start();
thread.join();
System.out.println("-- join --");
// 結果
// ↓
//-- start --
//Run!
//current : Thread[#33,Thread-3,5,group-A]
//-- join --
Thread (ThreadGroup group, Runnable task, String name)
final var group = new ThreadGroup("group-A");
final Runnable task = () -> {
System.out.println("Run!");
final var current = Thread.currentThread();
System.out.println("current : " + current);
};
final var thread = new Thread(group, task, "name-A");
System.out.println("-- start --");
thread.start();
thread.join();
System.out.println("-- join --");
// 結果
// ↓
//-- start --
//Run!
//current : Thread[#33,name-A,5,group-A]
//-- join --
Thread (ThreadGroup group, Runnable task, String name, long stackSize)
stackSize 以外は Thread(ThreadGroup group, Runnable task, String name) と同等です。
そちらのAPI使用例もご参照ください。
runTest(1);
// 結果
// ↓
//-- start --
//Run!
//StackOverflowError!
//-- join --
runTest(10000000);
// 結果
// ↓
//-- start --
//Run!
//OK!
//-- join --
public void runTest(int stackSize) throws InterruptedException {
final Runnable task = () -> {
System.out.println("Run!");
try {
recursive(0);
System.out.println("OK!");
} catch (StackOverflowError e) {
System.out.println("StackOverflowError!");
}
};
final var thread = new Thread(null, task, "", stackSize);
System.out.println("-- start --");
thread.start();
thread.join();
System.out.println("-- join --");
}
// StackOverflowErrorを意図的に起こすための再帰メソッドです。
public void recursive(int i) {
if (i > 100000) {
return;
}
recursive(i + 1);
}
Thread (ThreadGroup group, Runnable task, String name, long stackSize, boolean inheritInheritableThreadLocals)
inheritInheritableThreadLocals 以外は Thread(ThreadGroup group, Runnable task, String name, long stackSize) と同等です。
そちらのAPI使用例もご参照ください。
runTest(true);
// 結果
// ↓
//parent get : abcd
//child get : abcd
// ※threadLocalの値が子スレッドに継承されます。
runTest(false);
// 結果
// ↓
//parent get : abcd
//child get : null
// ※threadLocalの値が子スレッドに継承されません。
public void runTest(boolean inheritThreadLocals) throws InterruptedException {
final var threadLocal = new InheritableThreadLocal<String>();
final Runnable task = () -> {
threadLocal.set("abcd");
System.out.println("parent get : " + threadLocal.get());
final var childThread = new Thread(null, () -> {
System.out.println("child get : " + threadLocal.get());
}, "name-A", 0, inheritThreadLocals);
try {
childThread.start();
childThread.join();
} catch (InterruptedException e) {
System.out.println("Interrupted!");
}
};
final var parentThread = new Thread(task);
parentThread.start();
parentThread.join();
}
Thread (ThreadGroup group, String name)
final var group = new ThreadGroup("group-A");
final var name = "name-A";
final var thread = new Thread(group, name) {
@Override
public void run() {
System.out.println("Run!");
final var current = Thread.currentThread();
System.out.println("current : " + current);
}
};
System.out.println("-- start --");
thread.start();
thread.join();
System.out.println("-- join --");
// 結果
// ↓
//-- start --
//Run!
//current : Thread[#33,name-A,5,group-A]
//-- join --
メソッド
static int activeCount ()
final var groupA = new ThreadGroup("group-A");
final var groupB = new ThreadGroup("group-B");
final var thread = new Thread(groupA, () -> {
final var current = Thread.currentThread();
System.out.println(current.getThreadGroup().getName());
System.out.println("activeCount : " + Thread.activeCount());
final Runnable task = () -> {
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
System.out.println("Interrupted!");
}
};
try {
final var t1 = new Thread(task);
t1.start();
System.out.println(t1.getThreadGroup().getName());
System.out.println("activeCount : " + Thread.activeCount());
final var t2 = new Thread(task);
t2.start();
System.out.println(t2.getThreadGroup().getName());
System.out.println("activeCount : " + Thread.activeCount());
// グループを別にするとカウントされません。
final var t3 = new Thread(groupB, task);
t3.start();
System.out.println(t3.getThreadGroup().getName());
System.out.println("activeCount : " + Thread.activeCount());
t1.join();
t2.join();
t3.join();
} catch (InterruptedException e) {
System.out.println("Interrupted!");
}
});
System.out.println("-- start --");
thread.start();
thread.join();
System.out.println("-- join --");
// 結果
// ↓
//-- start --
//group-A
//activeCount : 1
//group-A
//activeCount : 2
//group-A
//activeCount : 3
//group-B
//activeCount : 3
//-- join --
final void checkAccess ()
非推奨です。
protected Object clone ()
final var thread = new Thread() {
@Override
public void run() {
try {
System.out.println("Run!");
clone();
} catch (CloneNotSupportedException e) {
System.out.println("CloneNotSupportedException!");
}
}
};
System.out.println("-- start --");
thread.start();
thread.join();
System.out.println("-- join --");
// 結果
// ↓
//-- start --
//Run!
//CloneNotSupportedException!
//-- join --
int countStackFrames ()
非推奨です。
static Thread currentThread ()
final Runnable task = () -> {
final var current = Thread.currentThread();
System.out.println(current.getName());
};
final var threadA = new Thread(task, "name-A");
final var threadB = new Thread(task, "name-B");
final var threadC = new Thread(task, "name-C");
System.out.println("-- start --");
threadA.start();
threadB.start();
threadC.start();
threadA.join();
threadB.join();
threadC.join();
System.out.println("-- join --");
// 結果
// ↓
//-- start --
//name-A
//name-B
//name-C
//-- join --
static void dumpStack ()
final Thread thread = new Thread(() -> {
Thread.dumpStack();
});
System.out.println("-- start --");
thread.start();
thread.join();
System.out.println("-- join --");
// 結果
// ↓
//-- start --
//java.lang.Exception: Stack trace
// at java.base/java.lang.Thread.dumpStack(Thread.java:1380)
// at ThreadTest.lambda$dumpStack$7(ThreadTest.java:638)
// at java.base/java.lang.Thread.run(Thread.java:833)
//-- join --
static int enumerate (Thread[] tarray)
final var groupA = new ThreadGroup("group-A");
final var groupB = new ThreadGroup("group-B");
final var baseThreadName = "name-baseA";
final var baseThread = new Thread(groupA, () -> {
final Runnable task = () -> {
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
System.out.println("Interrupted!");
}
};
try {
final var t1 = new Thread(task, "name-A1");
t1.start();
final var t2 = new Thread(task, "name-A2");
t2.start();
// 別グループ
final var t3 = new Thread(groupB, task);
t3.start();
final var threads = new Thread[Thread.activeCount()];
System.out.println("threads length : " + threads.length);
Thread.enumerate(threads);
for (final var thread : threads) {
System.out.println("thread : " + thread.getName());
}
t1.join();
t2.join();
t3.join();
} catch (InterruptedException e) {
System.out.println("Interrupted!");
}
}, baseThreadName);
System.out.println("-- start --");
baseThread.start();
baseThread.join();
System.out.println("-- join --");
// 結果
// ↓
//-- start --
//threads length : 3
//thread : name-baseA
//thread : name-A1
//thread : name-A2
//-- join --
static Map<Thread,StackTraceElement[]> getAllStackTraces ()
final var thread = new Thread(() -> {
final var stackTracesMap = Thread.getAllStackTraces();
for (final var entry : stackTracesMap.entrySet()) {
System.out.println("============= entry =============");
final var key = entry.getKey();
System.out.println("thread name : " + key.getName());
for (final var stackTraces : entry.getValue()) {
System.out.println(stackTraces);
}
}
}, "name-A");
System.out.println("-- start --");
thread.start();
thread.join();
System.out.println("-- join --");
// 結果
// ↓
//============= entry =============
//thread name : main
//java.base@19.0.2/java.lang.Object.wait0(Native Method)
//java.base@19.0.2/java.lang.Object.wait(Object.java:366)
//java.base@19.0.2/java.lang.Thread.join(Thread.java:2151)
//java.base@19.0.2/java.lang.Thread.join(Thread.java:2227)
//Main.main(Main.java:20)
//...
//============= entry =============
//thread name : name-A
//java.base@19.0.2/java.lang.Thread.dumpThreads(Native Method)
//java.base@19.0.2/java.lang.Thread.getAllStackTraces(Thread.java:2621)
//Main.lambda$main$0(Main.java:5)
//...
ClassLoader getContextClassLoader ()
final var thread = new Thread(() -> {
System.out.println("Run!");
});
final var before = thread.getContextClassLoader();
System.out.println(before); // jdk.internal.loader.ClassLoaders$AppClassLoader@4e25154f
final var url = new URL("file:/R:/java-work/classes");
thread.setContextClassLoader(new URLClassLoader(new URL[]{url}));
final var after = thread.getContextClassLoader();
System.out.println(after); // java.net.URLClassLoader@5c7bfdc1
static Thread.UncaughtExceptionHandler getDefaultUncaughtExceptionHandler ()
final var handler = new Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread t, Throwable e) {
System.out.println("uncaughtException called");
System.out.println("thread name : " + t.getName());
System.out.println("throwable : " + e.getMessage());
}
};
System.out.println("handler : " + Thread.getDefaultUncaughtExceptionHandler());
Thread.setDefaultUncaughtExceptionHandler(handler);
System.out.println("handler : " + (Thread.getDefaultUncaughtExceptionHandler() == handler));
final var thread = new Thread(() -> {
throw new RuntimeException("Exception!");
}, "name-A");
System.out.println("-- start --");
thread.start();
thread.join();
System.out.println("-- join --");
// 結果
// ↓
//handler : null
//handler : true
//-- start --
//uncaughtException called
//thread name : name-A
//throwable : Exception!
//-- join --
long getId ()
非推奨です。代わりに threadId() を使います。
final String getName ()
final var thread = new Thread(() -> {
System.out.println("thread : " + Thread.currentThread().getName());
}, "name-A");
System.out.println("-- start --");
thread.start();
thread.join();
System.out.println("-- join --");
// 結果
// ↓
//-- start --
//thread : name-A
//-- join --
final var thread = new Thread(() -> {
System.out.println("thread : " + Thread.currentThread().getName());
});
thread.setName("name-B");
System.out.println("-- start --");
thread.start();
thread.join();
System.out.println("-- join --");
// 結果
// ↓
//-- start --
//thread : name-B
//-- join --
final int getPriority ()
final var t1 = new Thread(() -> {
System.out.println("thread default priority : " + Thread.currentThread().getPriority());
});
final var t2 = new Thread(() -> {
System.out.println("thread min priority : " + Thread.currentThread().getPriority());
});
final var t3 = new Thread(() -> {
System.out.println("thread max priority : " + Thread.currentThread().getPriority());
});
t2.setPriority(Thread.MIN_PRIORITY);
t3.setPriority(Thread.MAX_PRIORITY);
System.out.println("-- start --");
t1.start();
t2.start();
t3.start();
t1.join();
t2.join();
t3.join();
System.out.println("-- join --");
// 結果
// ↓
//-- start --
//thread default priority : 5
//thread min priority : 1
//thread max priority : 10
//-- join --
StackTraceElement[] getStackTrace ()
final var thread = new Thread(() -> {
final var current = Thread.currentThread();
for (final var stackTrace : current.getStackTrace()) {
System.out.println(stackTrace);
}
});
System.out.println("-- start --");
thread.start();
thread.join();
System.out.println("-- join --");
// 結果
// ↓
//-- start --
//java.base/java.lang.Thread.getStackTrace(Thread.java:1610)
//ThreadTest.lambda$getStackTraces$20(ThreadTest.java:1010)
//java.base/java.lang.Thread.run(Thread.java:833)
//-- join --
Thread.State getState ()
final var thread = new Thread(() -> {
final var current = Thread.currentThread();
System.out.println("state run : " + current.getState());
});
System.out.println("state new : " + thread.getState());
System.out.println("-- start --");
thread.start();
thread.join();
System.out.println("-- join --");
System.out.println("state term : " + thread.getState());
// 結果
// ↓
//state new : NEW
//-- start --
//state run : RUNNABLE
//-- join --
//state term : TERMINATED
final ThreadGroup getThreadGroup ()
final var group = new ThreadGroup("group-A");
final var thread = new Thread(group, () -> {
final var current = Thread.currentThread();
System.out.println("group : " + current.getThreadGroup());
});
System.out.println("-- start --");
thread.start();
thread.join();
System.out.println("-- join --");
// 結果
// ↓
//-- start --
//group : java.lang.ThreadGroup[name=group-A,maxpri=10]
//-- join --
Thread.UncaughtExceptionHandler getUncaughtExceptionHandler ()
final var handler = new Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread t, Throwable e) {
System.out.println("uncaughtException called");
System.out.println("thread name : " + t.getName());
System.out.println("throwable : " + e.getMessage());
}
};
final var thread = new Thread(() -> {
throw new RuntimeException("Exception!");
}, "name-A");
thread.setUncaughtExceptionHandler(handler);
System.out.println("handler : " + (thread.getUncaughtExceptionHandler() == handler));
System.out.println("-- start --");
thread.start();
thread.join();
System.out.println("-- join --");
// 結果
// ↓
//handler : true
//-- start --
//uncaughtException called
//thread name : name-A
//throwable : Exception!
//-- join --
static boolean holdsLock (Object obj)
final var obj = new Object();
synchronized (obj) {
System.out.println(Thread.holdsLock(obj)); // true
}
System.out.println(Thread.holdsLock(obj)); // false
void interrupt ()
final var thread = new Thread(() -> {
try {
System.out.println("task start");
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
System.out.println("Interrupted!");
} finally {
System.out.println("task end");
}
});
System.out.println("-- start --");
thread.start();
thread.interrupt();
thread.join();
System.out.println("-- join --");
// 結果
// ↓
//-- start --
//task start
//Interrupted!
//task end
//-- join --
static boolean interrupted ()
このメソッドを呼び出すと、現在の割込みステータスを取得しつつ割込みステータスがクリアされます。
少し直感的ではないかもしれないのでご注意ください。
割込みステータス取得のみを目的とする場合は isInterrupted() をご使用ください。
final var thread = new Thread(() -> {
try {
System.out.println("task start");
System.out.println("before : " + Thread.interrupted());
while (!Thread.interrupted()) {
Thread.onSpinWait();
}
System.out.println("after : " + Thread.interrupted());
} finally {
System.out.println("task end");
}
});
System.out.println("-- start --");
thread.start();
TimeUnit.MILLISECONDS.sleep(100);
thread.interrupt();
thread.join();
System.out.println("-- join --");
// 結果
// ↓
//-- start --
//task start
//before : false
//after : false
//task end
//-- join --
final boolean isAlive ()
final var thread = new Thread(() -> {
try {
System.out.println("task start");
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
System.out.println("Interrupted!");
} finally {
System.out.println("task end");
}
});
System.out.println("isAlive : " + thread.isAlive());
System.out.println("-- start --");
thread.start();
System.out.println("isAlive : " + thread.isAlive());
thread.join();
System.out.println("-- join --");
System.out.println("isAlive : " + thread.isAlive());
// 結果
// ↓
//isAlive : false
//-- start --
//task start
//isAlive : true
//task end
//-- join --
//isAlive : false
final boolean isDaemon ()
final var daemonThread = new Thread(() -> {
try {
System.out.println("task start");
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
System.out.println("Interrupted!");
} finally {
System.out.println("task end");
}
});
daemonThread.setDaemon(true);
System.out.println("-- start --");
daemonThread.start();
TimeUnit.MILLISECONDS.sleep(100);
System.out.println("isDaemon : " + daemonThread.isDaemon());
daemonThread.join();
System.out.println("-- join --");
// 結果
// ↓
//-- start --
//task start
//isDaemon : true
//task end
//-- join --
boolean isInterrupted ()
final var thread = new Thread(() -> {
try {
System.out.println("task start");
System.out.println("before : " + Thread.interrupted());
final var current = Thread.currentThread();
while (!current.isInterrupted()) {
Thread.onSpinWait();
}
System.out.println("after : " + Thread.interrupted());
} finally {
System.out.println("task end");
}
});
System.out.println("-- start --");
thread.start();
TimeUnit.MILLISECONDS.sleep(100);
thread.interrupt();
thread.join();
System.out.println("-- join --");
// 結果
// ↓
//-- start --
//task start
//before : false
//after : true
//task end
//-- join --
final boolean isVirtual ()
プレビュー機能のためコード例は省略します。
final void join ()
final var thread = new Thread(() -> {
try {
System.out.println("task : start");
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
System.out.println("Interrupted!");
} finally {
System.out.println("task : end");
}
});
System.out.println("-- start --");
thread.start();
thread.join();
System.out.println("-- join --");
// 結果
// ↓
//-- start --
//task : start
//task : end
//-- join --
// ※joinはただ待つだけで、スレッドの割込みは行いません。
final void join (long millis)
final var thread = new Thread(() -> {
try {
System.out.println("task : start");
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
System.out.println("Interrupted!");
} finally {
System.out.println("task : end");
}
});
System.out.println("-- start --");
thread.start();
thread.join(2 * 1000);
System.out.println("-- join --");
TimeUnit.SECONDS.sleep(5);
System.out.println("-- sleep --");
// 結果
// ↓
//-- start --
//task : start
//-- join --
//task : end
//-- sleep --
// ※joinはただ待つだけで、スレッドの割込みは行いません。
final void join (long millis, int nanos)
final var thread = new Thread(() -> {
try {
System.out.println("task : start");
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
System.out.println("Interrupted!");
} finally {
System.out.println("task : end");
}
});
System.out.println("-- start --");
thread.start();
thread.join(2 * 1000, 1234);
System.out.println("-- join --");
TimeUnit.SECONDS.sleep(5);
System.out.println("-- sleep --");
// 結果
// ↓
//-- start --
//task : start
//-- join --
//task : end
//-- sleep --
// ※joinはただ待つだけで、スレッドの割込みは行いません。
final boolean join (Duration duration)
final var thread = new Thread(() -> {
try {
System.out.println("task : start");
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
System.out.println("Interrupted!");
} finally {
System.out.println("task : end");
}
});
System.out.println("-- start --");
thread.start();
final var ret1 = thread.join(Duration.ofMillis(500));
System.out.println("join1 : " + ret1);
final var ret2 = thread.join(Duration.ofSeconds(2));
System.out.println("join2 : " + ret2);
TimeUnit.SECONDS.sleep(5);
System.out.println("-- sleep --");
// 結果
// ↓
//-- start --
//task : start
//join1 : false
//task : end
//join2 : true
//-- sleep --
// ※joinはただ待つだけで、スレッドの割込みは行いません。
static Thread.Builder.OfPlatformPREVIEW ofPlatform ()
プレビュー機能のためコード例は省略します。
static Thread.Builder.OfVirtualPREVIEW ofVirtual ()
プレビュー機能のためコード例は省略します。
static void onSpinWait ()
このメソッドの使用例は、interrupted() にまとめて記載しました。
そちらのAPI使用例をご参照ください。
final void resume ()
非推奨です。
void run ()
final var thread = new Thread() {
@Override
public void run() {
System.out.println("Run!");
}
};
System.out.println("-- start --");
thread.start();
thread.join();
System.out.println("-- join --");
// 結果
// ↓
//-- start --
//Run!
//-- join --
void setContextClassLoader (ClassLoader cl)
このメソッドの使用例は、getContextClassLoader() にまとめて記載しました。
そちらのAPI使用例をご参照ください。
final void setDaemon (boolean on)
このメソッドの使用例は、isDaemon() にまとめて記載しました。
そちらのAPI使用例をご参照ください。
static void setDefaultUncaughtExceptionHandler (Thread.UncaughtExceptionHandler ueh)
このメソッドの使用例は、getDefaultUncaughtExceptionHandler() にまとめて記載しました。
そちらのAPI使用例をご参照ください。
final void setName (String name)
このメソッドの使用例は、getName() にまとめて記載しました。
そちらのAPI使用例をご参照ください。
final void setPriority (int newPriority)
このメソッドの使用例は、getPriority() にまとめて記載しました。
そちらのAPI使用例をご参照ください。
void setUncaughtExceptionHandler (Thread.UncaughtExceptionHandler ueh)
このメソッドの使用例は、getUncaughtExceptionHandler() にまとめて記載しました。
そちらのAPI使用例をご参照ください。
static void sleep (long millis)
final var start = System.nanoTime();
// 1秒スリープ
Thread.sleep(1000);
final var sec = (System.nanoTime() - start) / 1000000000.0;
System.out.println(sec); // 1.0088005
static void sleep (long millis, int nanos)
final var start = System.nanoTime();
Thread.sleep(1000, 999999);
final var sec = (System.nanoTime() - start) / 1000000000.0;
System.out.println(sec); // 1.0012892
// ※実行環境によってナノ秒の精度は変わりそうです。
static void sleep (Duration duration)
final var start = System.nanoTime();
// 1秒スリープ
Thread.sleep(Duration.ofSeconds(1));
final var sec = (System.nanoTime() - start) / 1000000000.0;
System.out.println(sec); // 1.0088005
final var start = System.nanoTime();
// 500ミリ秒スリープ
Thread.sleep(Duration.ofMillis(500));
final var sec = (System.nanoTime() - start) / 1000000000.0;
System.out.println(sec); // 0.5046906
void start ()
final var thread = new Thread(() -> System.out.println("Run!"));
System.out.println("-- start --");
thread.start();
thread.join();
System.out.println("-- join --");
// 結果
// ↓
//-- start --
//Run!
//-- join --
static Thread startVirtualThread (Runnable task)
プレビュー機能のためコード例は省略します。
final void stop ()
非推奨です。
final void suspend ()
非推奨です。
final long threadId ()
final var t1 = new Thread(() -> {
System.out.println("thread 1 : " + Thread.currentThread().threadId());
});
final var t2 = new Thread(() -> {
System.out.println("thread 2 : " + Thread.currentThread().threadId());
});
final var t3 = new Thread(() -> {
System.out.println("thread 3 : " + Thread.currentThread().threadId());
});
System.out.println("-- start --");
t1.start();
t2.start();
t3.start();
t1.join();
t2.join();
t3.join();
System.out.println("-- join --");
// 結果
// ↓
//-- start --
//thread 1 : 33
//thread 2 : 34
//thread 3 : 35
//-- join --
String toString ()
final var thread = new Thread(new ThreadGroup("group-A"),
() -> System.out.println("Run!"), "name-A");
thread.setPriority(7);
final var str = thread.toString();
System.out.println(str);
System.out.println("-- start --");
thread.start();
thread.join();
System.out.println("-- join --");
// 結果
// ↓
//Thread[#33,name-A,7,group-A]
//-- start --
//Run!
//-- join --
static void yield ()
API仕様に "このメソッドを使用する機会はまれにしかありません" とあるのでコード例は省略します。
(呼び出したことによる効果が確認しづらい、ということもあり…)
関連記事
- API 使用例
- BlockingQueue (ブロッキング・キュー)
- Callable
- CancellationException
- ConcurrentHashMap.KeySetView (並列処理用セット)
- ConcurrentLinkedDeque (並列処理用・両端キュー)
- ConcurrentLinkedQueue (並列処理用キュー)
- ConcurrentMap (並列処理用マップ)
- ConcurrentModificationException (並列処理例外)
- ConcurrentSkipListSet (並列処理用セット)
- Condition (同期)
- CopyOnWriteArrayList (並列処理用リスト)
- CopyOnWriteArraySet (並列処理用セット)
- CountDownLatch (同期)
- CyclicBarrier (同期)
- Exchanger (同期)
- Executor
- ExecutorService
- Executors
- Future
- Future.State
- FutureTask
- InterruptedException (割込み例外)
- Lock (同期)
- Object (オブジェクト)
- Runnable
- Semaphore (セマフォ)
- ThreadGroup
- ThreadLocal
- TimeUnit