Java 多线程

目录

多线程的第一种启动方式:

多线程的第二种启动方式:

多线程的第三种实现方式:

 抢红包案例


多线程的第一种启动方式:


1.自己定义一个类继承Thread

2.重写run方法
3.创建子类的对象,并启动线程
 

package text1;

public class MyThread extends  Thread{
    @Override
    public void run() {
        for(int i=0;i<100;i++){
            System.out.println(getName()+"666");
        }
    }
}
package text1;

import java.util.ArrayList;
import java.util.List;

public class main {


    public static void main(String[] args) {
      MyThread mt1=new MyThread();
      MyThread mt2=new MyThread();
      mt1.setName("线程1:");
      mt2.setName("线程2:");
      mt1.start();
      mt2.start();
    }
}

多线程的第二种启动方式:


1.自己定义一个类实现Runnable接口

2.重写里面的run方法
3.创建自己的类的对象
4.创建一个Thread类的对象,并开启线程
 

package text;

public class myrun implements Runnable{

    @Override
    public void run() {
        for(int i=1;i<=100;i++){
            System.out.println(Thread.currentThread().getName()+"666");//注意和第一种的差别
        }
    }
}
package text;

public class main {
    public static void main(String[] args) {
        myrun r=new myrun();
        Thread t1=new Thread(r);
        Thread t2=new Thread(r);
        t1.setName("线程1:");
        t2.setName("线程2:");
        t1.start();
        t2.start();
    }
}

多线程的第三种实现方式:


特点:可以获取到多线程运行的结果
1.创建一个类MyCallable实现Callable接口
2.重写call(是有返回值的,表示多线程运行的结果)
3.创建MyCallable的对象(表示多线程要执行的任务〉

4.创建FutureTask的对象(作用管理多线程运行的结果)

5.创建Thread类的对象,并启动(表示线程)

计算1+.....+100
 

package text2;

import java.util.concurrent.Callable;

public class MyCallable implements Callable {

    @Override
    public Integer call() throws Exception {
        int sum=0;
        for(int i=1;i<=100;i++){
            sum=sum+i;
        }
        return sum;
    }
}
package text2;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

public class main {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        MyCallable mc=new MyCallable();
        FutureTask f=new FutureTask<>(mc);
        Thread t=new Thread(f);
        t.start();
        Integer temp= f.get();
        System.out.println(temp);
    }
}

 抢红包案例

package runbag;

import java.util.Random;

public class mythread  extends Thread{
    static double money=100;//总红包金额
    static int count=3;//红包个数
    static final double MIN=0.01;//红包的最小金额

    @Override
    public void run() {
        //同步代码块
        synchronized(mythread.class) {
            double price=0;//抢到的红包金额
            //判断是进行到最后一步
            if(count==0){
                System.out.println(getName()+"没有抢到红包!");
            }else{
                if(count==1) {
                    //最后一个抢到的人,不用再用随机函数了
                    price = money;
                    System.out.println("恭喜" + getName() + "抢到" + price + "元");
                }
                else{
                    //第一个人不可能抢到100块,最多99.98,所以要确定范围
                    double bounds=money -(count-1)*MIN;
                    Random r= new Random();
                    price=r.nextDouble()*bounds;
                    if(price
package runbag;

public class main {
    public static void main(String[] args) {
        mythread mt1=new mythread();
        mythread mt2=new mythread();
        mythread mt3=new mythread();
        mythread mt4=new mythread();
        mythread mt5=new mythread();

        mt1.setName("蔡徐坤");
        mt2.setName("甘鸭");
        mt3.setName("B");
        mt4.setName("C");
        mt5.setName("D");

        mt1.start();
        mt2.start();
        mt3.start();
        mt4.start();
        mt5.start();
    }
}

Java 多线程_第1张图片

 

你可能感兴趣的:(Java,java,jvm,数据结构)