Thread
使用新线程的步骤:
- 通过覆写 Thread 的
run
方法,配置新线程需要做的事情 - 创建新线程对象
new YourThread()
- 开启线程
start
创建新线程的方法有很多,下面是一个示例:
class MyThread extends Thread { @Override public void run () { System.out.println("在新的线程内运行的任务。这任务是独立的,不会影响主线程代码执行。"); }}public class Main { public static void main (String... args) { Thread myThread = new MyThread(); // 创建线程 mythread.start(); // 运行线程 }}
也可以这样:
class MyThread implements Runnable { @Override public void run () { System.out.println("在新的线程内运行的任务。这任务是独立的,不会影响主线程代码执行。"); }}public class Main { public static void main (String... args) { Thread myThread = new Thread(new MyThread()); // 创建线程 mythread.start(); // 运行线程 }}
上面代码可以简写为:
// 使用匿名内部类进行简化public class Main { public static void main (String... args) { Thread myThread = new Thread () { @Override public void run () { System.out.println("在新的线程内运行的任务。这任务是独立的,不会影响主线程代码执行。"); } }; myThread.start(); }}
使用 jdk8 的语法,甚至可以简化为:
public class Main { public static void main (String... args) { new Thread(() -> System.out.println("task")).start(); }}
其他:
- t.join()
- 让当前线程阻塞并等待线程 t 结束再执行接下来代码 Thread.sleep()
- 让当前线程暂时休眠 n 毫秒,这过程不会释放所占用的对象锁 Thread.yield()
- 暂时退让,优先让其他线程先运行。如果没有线程在这个过程中抢占运行权,则继续运行
- Executors 是一个常用的静态类,内置了很多线程池相关的操作。
-
线程池使用的基本语法:
// 1. 创建线程池ExecutorService service = Executors.newCachedThreadPool();// 2. 创建任务Runnable task = new Runnable() { @Override public void run() { System.out.println(Thread.currentThread()); } };// 3. 使用线程池调度任务for (int i = 0; i < 1000; i++) { service.execute(task);}// 4. 关闭线程池service.shutdown();
可以简化为:
ExecutorService service = Executors.newCachedThreadPool();for (int i = 0; i < count; i++) { service.execute(new Runnable() { @Override public void run() { System.out.println(Thread.currentThread()); } });}
可以进一步简化为(jdk8语法):
ExecutorService service = Executors.newCachedThreadPool();for (int i = 0; i < count; i++) { service.execute(() -> System.out.println(Thread.currentThread()));}