java值多线程的总结

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ZSS1753936255/article/details/82863288

java多线程的放肆有四种
1.继承Thread类,重写run方法。
2.实现Runnable接口,重写run方法,实现Runnable接口的实现类实例对象作为Thread构造器函数的target.
3.通过Callable和FutureTask创建线程。
4.创建线程池创建线程
前面两种可以归一类:无返回值,原因很简单,通过重写run方法,run方式的返回值是void,
后面两种可以归一类:有返回值,通过Callable接口,就要实现call方法,这个方法的返回值就是Object,所以返回的结果可以放在Object对象中所以返回的结果可以放在Object对象中。
Thread class Thread1 extends Thread{
        public Thread1(){

        }
        public void run(){
        System.out.println(Thread.currentThread().getName());
        }
        public static void main(String[] args){
            Thread1 thread1=new Thread1();
            thread1.setName("我是自定义的线程1");
            thread1.start();
            System.out.println(Thread.currentThread().toString());
        }
}
//这里输出的话
Thread[main,5,main]
我是自定义的线程

线程实现方式2:通过实现Runnable接口,实现run方法,
接口的实现类的实例作为Thread的target作为参数传入带参数的Thread构造函数,通过调用start()方法启动线程。
public class Thread2{
    public static void main(String] args){
            System.out.prinyln(Thread.currentTghread().getName());//这是打印出来的信息。
            Thread t1=new Thread(new MyThread());
            t1.start();
    }
}
class MyThread implements Runnable{
    @Override
    public void run(){
    System.out.println(Thread.currentThread().getName()+"我是通过实现接口的线程方式。");
    }
}
线程实现方式3:通过Callable和Future创建线程
a:创建Callable接口的实现类,并实现call方法。
b:创建Callable实现类的实现,使用FutureTask创建线程。
c:使用FutureTask对象作为Thread对象的target创建并启动线程。
d:调用FutureTask对象的get()来获取子线程执行结束返回值。
public class Thread3{
        public static void main(String[] args){
            Callable<Obejct> oneCallable=new Tickets<Obejct>();
            FutureTask<> oneTask=new Future<Object>(oneCallable);
            Thread t=new Thread(oneTask);
            System.out.println(Thread.currentThread().getName());
            t.start();
        }
}

下面的例子演示了100个线程同时向一个银行账户中存入1元钱,在没有使用同步机制和使用同步机制情况下的执行情况。

1.在银行账户的存款(deposit)方法上同步(synchronized)关键字。
public  class Accout{
    private double balance;

    public synchronized void deposit(double money){/这里对方法的上锁后,表示同步方法,
    其他方法就不能访问同步方法。
            double newBalance =balance+money;
            try{
                    Thread.sleep(10);
            }catch(Exception e){
                e.printStackTrace();
            }
            balance=newBalance;
    }
        public double getBalance(){
        return balance;
        }
}
2.在线程调用存款方法时对银行账户进行同步
public class AddMoneyThread implements Runable{
    private Account account;//存入账户
    private double money;//存入金额
    public AddMoneyThread(Account account,double money){
    this.account=account;
    this.money=money;
    }
    @Override
    public void run(){
        synchronized(account){//这里就是相当于同步代码块。
            account.deposit(meney);
        }
    }

}
synchronized关键字可以将对象或者方法标记为同步,以实现对对象和方法的互斥访问,
可以用synchronized(对象){。。。}定义同步代码块。或者在声明方法时将synchronized作为方法的修饰符。
同步就是阻塞式操作,而一部就是非阻塞式操作。

这里我们说明的一下就是:实现线程继承Thread和实现Runnable的区别:

我们知道的是一类只能是单继承,但是可以是多实现。所以继承Thread类有局限性,

但是实现Runnable很显然,我们可以继承其他类。

猜你喜欢

转载自blog.csdn.net/ZSS1753936255/article/details/82863288
今日推荐