# 线程的创建
## 线程的创建
**线程的创建有三种方式**
* **继承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中的代码可以被多个线程共享,适用于多个线程共享一个资源的场景