一、创建线程方式一
/**
1、自定义一个类继承Thread,重写run方法,然后创建一个新对象调用start方法即可
2、该方式代码简单,但由于继承了Thread,不利于扩展
3、主线程需要放子线程后面,否则先执行主线程,仍然跟单线程效果一样
*/
public class CreateThread {
public static void main(String[] args) {
Thread t = new Mythread();
t.start();
for (int i = 0; i < 5; i++) {
System.out.println("主线程" + i);
}
}
}
class Mythread extends Thread{
@Override
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println("子线程" + i);
}
}
}
二、创建线程方式二
package com.ruqi.createthread;
/**
1、定义一个线程 任务类MyRunnable实现Runnable接口,重写run()方法
2、创建MyRunnable对象
3、把MyRunnable任务对象交给Thread线程对象处理。
●优点: 线程任务类只是实现了Runnale接口,可以继续继承和实现。
●缺点: 如果线程有执行结果是不能直接返回的。
*/
public class Createthread2 {
public static void main(String[] args) {
Myrunnable target = new Myrunnable();
Thread t = new Thread(target);
t.start();
//简写,由源码得知,run方法属于接口函数,可进行简写
new Thread(()->{
for (int i = 0; i < 5; i++) {
System.out.println("子线程2" + i);
}
}).start();
for (int i = 0; i < 5; i++) {
System.out.println("主线程" + i);
}
}
}
class Myrunnable implements Runnable{
@Override
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println("子线程" + i);
}
}
}
三、创建线程方式三
import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;
/**
* 1、创建一个任务类继承Callable,且需要定义好返回的数据类型
* 2、重写call方法
* 3、创建一个任务类
* 4、将任务类放到FutureTask,该类继承了Runnable,因此Thread类才可以接收自定义的类
* 5、创建线程后启动,通过FutureTask的get方法得到返回值
*/
public class Createthread3 {
public static void main(String[] args) throws Exception {
MyFutureTask fu = new MyFutureTask(100);
FutureTask<String> futask = new FutureTask<>(fu);
Thread t = new Thread(futask);
t.start();
System.out.println(futask.get());
}
}
class MyFutureTask implements Callable<String> {
private int n;
public MyFutureTask(int n) {
this.n = n;
}
@Override
public String call() throws Exception {
int sum = 0;
for (int i = 0; i < n; i++) {
sum += i;
}
return "总和="+sum;
}
}
Thread 常用api
//通过有参构造器重定义线程名称
public class CreateThread {
public static void main(String[] args) {
Thread t = new Mythread("1号线程名称");
t.start();
Thread t1 = new Mythread("2号线程名称");
t1.start();
}
}
class Mythread extends Thread{
public Mythread() {}
public Mythread(String name) {
super(name);
}
@Override
public void run() {
for (int i = 0; i < 5; i++) {
Thread.sleep(1000);//线程等待,单位毫秒
System.out.println(Thread.currentThread().getName() + i);
}
}
}