合规国际互联网加速 OSASE为企业客户提供高速稳定SD-WAN国际加速解决方案。 广告
# 线程的创建 ## 线程的创建 **线程的创建有三种方式** * **继承Thread类** * **实现Runnable接口** * 实现Callable接口 >[info]可以通过实现Callable接口,重写call()方法 常用的创建线程的方法就是继承Thread类和实现Runable接口,第三种方法自学完善。 ### 继承Thread类 Thread是一个线程类,位于java.lang包下 **Thread类常用构造方法** | 构造方法 | 说明 | | :---: | :---: | | Thread() | 创建一个线程对象 | | Thread(String name) | 创建一个具有指定名称的线程对象 | | Thread(Runnable target) | 创建一个基于Runnable接口实现类的线程对象 | | Thread(Runnable target,String name) | 创建一个基于Runnable接口实现类,并具有指定名称的线程对象 | **Thread类常用方法** | 方法 | 说明 | | :---: | :---: | | public void run() | 线程相关的代码写在该方法中,一般需要重写 | | public void start() | 启动线程的方法 | | public static void sleep(long m) | 线程休眠m毫秒的方法 | | public void join() | 优先执行调用join()方法的线程 | **使用Thread类创建线程** ~~~ public class MyThread extends Thread { @Override public void run() { System.out.println(getName() + " say:Hello,World"); } } //该段程序中共有两个线程,一个是主线程,还有一个则是我们自己创建的myThread线程 //main方法是一个主线程,程序的启动都是由main方法来启动的,如有兴趣可以了解下用户线程和守护线程 public static void main(String[] args) { System.out.println("主线程1"); MyThread myThread = new MyThread(); //使用start方法启动线程,执行的是run方法中的代码 myThread.start(); //线程是不能被多次启动的,否则会报不合逻辑的线程错误 //只能启动一次 //myThread.start(); System.out.println("主线程2"); } 输出结果:最后的结果其实是不可预知的,因为我们不知道什么时候线程才会获得CPU的使用权 主线程1 主线程2 Thread-0 say:Hello,World ~~~ ~~~ public class MyThread extends Thread { public MyThread(String name) { super(name); } @Override public void run() { for(int i = 0; i < 10; i++) { System.out.println(getName() + "线程正在循环第" + i + "次"); } } } public class ThreadTest { public static void main(String[] args) { MyThread mtf = new MyThread("我的线程1"); mtf.start(); MyThread mts = new MyThread("我的线程2"); mts.start(); } } 输出结果: 随机的结果 ~~~ ## 实现Runnable接口 * 只有一个方法run() * Runnable是Java中用以实现线程的接口 * 任何实现线程功能的类都必须实现该接口 **为什么要使用Runnable接口** * Java不支持多继承 * 不打算重写Thread类的其他方法 **使用Runnable创建线程** ~~~java public class MyRunnable implements Runnable{ @Override public void run() { //打印该线程的当前线程名称 System.out.println(Thread.currentThread().getName()+"say:Hello,World"); } } public class MyRunnableUse { public static void main(String[] args) { MyRunnable myRunnable = new MyRunnable(); Thread thread = new Thread(myRunnable); thread.start(); MyRunnable myRunnable1 = new MyRunnable(); Thread thread1 = new Thread(myRunnable1); thread1.start(); } } 运行结果: Thread-1say:Hello,World Thread-0say:Hello,World 其实也是随机的 ~~~ ~~~java public class MyRunnable implements Runnable{ @Override public void run() { int i = 1; while(i <= 10) { //打印该线程的当前线程名称 System.out.println(Thread.currentThread().getName()+"say:Hello,World" + i); i++; } } } public class MyRunnableUse { public static void main(String[] args) { MyRunnable myRunnable = new MyRunnable(); Thread thread = new Thread(myRunnable); thread.start(); MyRunnable myRunnable1 = new MyRunnable(); Thread thread1 = new Thread(myRunnable1); thread1.start(); } } ~~~ >[warning]Runnable中的代码可以被多个线程共享,适用于多个线程共享一个资源的场景