1 方式1:继承Thread类 重写run方法
1 创建类继承Thread
2 重写run方法 封装线程任务
3 创建此Thread子类对象
4 调用start方法 启动线程
public class Demo01 {
public static void main(String[] args) {
MyThread mt1=new MyThread(); mt1.setName("继承Thread重写run方法:::");
mt1.start();
for (int i = 0; i < 50; i++) {
try {Thread.sleep(50);} catch (Exception e) {}
System.out.println(Thread.currentThread().getName()+"::::"+i+"::::"+Math.random());
}
}
}
class MyThread extends Thread{
public void run(){
for (int i = 0; i < 50; i++) {
try {Thread.sleep(50);} catch (Exception e) {}
System.out.println(Thread.currentThread().getName()+"::::"+i+"::::"+(char)(Math.random()*10+'0'));
}
}
}
2 方式2:实现Runnable接口 实现run方法
//1 创建Runnable接口的实现类
//2 实现run方法
//3 创建实现类实例
//4 创建线程对象 并通过构造方法关联实现类对象
//5启动线程
public class Demo01 {
public static void main(String[] args) {
MyImp imp1=new MyImp();
Thread t2=new Thread(imp1);t2.setName("实现Runnable接口 实现run方法!!!!!");
t2.start();
for (int i = 0; i < 50; i++) {
try {Thread.sleep(50);} catch (Exception e) {}
System.out.println(Thread.currentThread().getName()+"::::"+i+"::::"+Math.random());
}
}
}
class MyImp implements Runnable{
public void run(){
for (int i = 0; i < 50; i++) {
try {Thread.sleep(50);} catch (Exception e) {}
System.out.println(Thread.currentThread().getName()+"::::"+i+"::::"+(char)(Math.random()*26+'a'));
}
}
}
3 方式3:实现Callable接口 实现call方法
1:创建Callable接口的实现类
2:实现call方法:可以抛出异常 并指定返回值
3:创建实现类对象
4: 创建FutureTask对象 并通过构造方法关联实现类对象
5: 创建线程对象 并通过构造方法关联FutureTask对象
6:启动线程
7:通过FutureTask对象的get方法获取返回值
public class Demo01 {
public static void main(String[] args) throws Exception{
MyCall call1=new MyCall();
FutureTask<Integer> task=new FutureTask<Integer>(call1);
Thread t3=new Thread(task);t3.setName("实现Runnable接口 实现run方法!!!!!");
t3.start();
System.out.println("线程的返回值是:::::::::sum="+task.get());
for (int i = 0; i < 50; i++) {
try {Thread.sleep(50);} catch (Exception e) {}
System.out.println(Thread.currentThread().getName()+"::::"+i+"::::"+Math.random());
}
}
}
class MyCall implements Callable<Integer>{
public Integer call() throws Exception {
int sum=0;
for (int i = 0; i < 50; i++) {
Thread.sleep(50);
int score=(int)(Math.random()*100);
sum+=score;
System.out.println(Thread.currentThread().getName()+"::::"+i+"::::"+score);
}
return sum;
}
}
class MyImp implements Runnable{
public void run(){
for (int i = 0; i < 50; i++) {
try {Thread.sleep(50);} catch (Exception e) {}
System.out.println(Thread.currentThread().getName()+"::::"+i+"::::"+(char)(Math.random()*26+'a'));
}
}
}
class MyThread extends Thread{
public void run(){
for (int i = 0; i < 50; i++) {
try {Thread.sleep(50);} catch (Exception e) {}
System.out.println(Thread.currentThread().getName()+"::::"+i+"::::"+(char)(Math.random()*10+'0'));
}
}
}
4 方式4:通过线程池对象
对指定个数个线程对象的创建,维护,分配,销毁等工作进行管理的对象::池对象
作用:实现对象的复用:避免频繁的创建和销毁
1 创建Callable或者Runnable的实现类
2 重写run/call方法 封装线程任务
3 创建ExecutorService线程池对象 并指池类型
4 通过池对象的submit方法 来提交线程任务::如果提交的线程任务是Callable 开头通过Future来接受线程的返回值
5 调用shutdown方法:关闭池对象
public class Demo01 {
public static void main(String[] args) throws Exception{
MyImp imp1=new MyImp();
MyCall call1=new MyCall();
ExecutorService service=Executors.newFixedThreadPool(4);
service.submit(imp1);
service.submit(new Runnable() {
public void run() {
for (int i = 0; i < 50; i++) {
try {Thread.sleep(50);} catch (Exception e) {}
System.out.println(Thread.currentThread().getName()+"::::"+i+":::::@@@@@@@@@@@@@@@@"+(char)(Math.random()*26+'A'));
}
}
});
Future<Integer> future1=service.submit(call1);
Future<Double> future2=service.submit(new Callable<Double>() {
public Double call() throws Exception {
double sum=0;
for (int i = 0; i < 50; i++) {
Thread.sleep(50);double score=(int)(Math.random()*100);sum+=score;
System.out.println(Thread.currentThread().getName()+"::::"+i+":::::###########################"+score);
}
return sum;
}
});
System.out.println("线程3的返回值:::"+future1.get());
System.out.println("线程4的返回值:::"+future2.get());
service.shutdown();
}
}
class MyCall implements Callable<Integer>{
public Integer call() throws Exception {
int sum=0;
for (int i = 0; i < 50; i++) {
Thread.sleep(50);
int score=(int)(Math.random()*100);
sum+=score;
System.out.println(Thread.currentThread().getName()+"::::"+i+"::::"+score);
}
return sum;
}
}
class MyImp implements Runnable{
public void run(){
for (int i = 0; i < 50; i++) {
try {Thread.sleep(50);} catch (Exception e) {}
System.out.println(Thread.currentThread().getName()+"::::"+i+"::::!!!!!"+(char)(Math.random()*26+'a'));
}
}
}
class MyThread extends Thread{
public void run(){
for (int i = 0; i < 50; i++) {
try {Thread.sleep(50);} catch (Exception e) {}
System.out.println(Thread.currentThread().getName()+"::::"+i+"::::<<<<<<<<<"+(char)(Math.random()*10+'0'));
}
}
}