java的多线程

Posted zs-book1

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java的多线程相关的知识,希望对你有一定的参考价值。

线程的概念等之前讲过,今天主要写线程的安全性问题

1.实现多线程的两种方式:

package com.zs.service;

/**
 * 通过继承实现多线程,
 * 优点:代码简单
 * 缺点: 单继承的局限性
 */
public class Demo1 extends Thread 
    @Override
    public void run() 
        for (int i = 0; i < 10; i++) 
            System.out.println(Thread.currentThread().getName() + "第" + i + "次");
        
    

    public static void main(String[] args) 
        Demo1 demo1 = new Demo1();
        Demo1 demo2 = new Demo1();
        demo1.start();
        demo2.start();
    
package com.zs.service;

/**
 * 实现继承的第二种方式,通过实现runnable接口实现多线程
 * 优点:避免了单继承的局限行
 * 缺点:代码比较复杂
 *
 * 通常使用这种方式实现多线程,代码的可拓展性更强
 */
public class Demo2 implements Runnable 
    @Override
    public void run() 
        for (int i = 0; i < 10; i++) 
            System.out.println(Thread.currentThread().getName() + "第" + i + "次");
        
    

    public static void main(String[] args) 
        Demo2 demo2 = new Demo2();
        Thread t1 = new Thread(demo2);
        Thread t2 = new Thread(demo2);
        t1.start();
        t2.start();
    

多线程主要有以上两种实现方式,一般使用接口的方式实现多线程,因为代码的拓展性强,下面我们来通过一个案例来理解线程的同步锁:

模拟一个网络买车票,多个窗口一块卖同一批车票,因此是多线程,下面通过代码实现:

package com.zs.service;

public class ChePiao implements Runnable 
    private int count=50;//定义总共有50张票
    private int num = 0;//卖出第几张票
    @Override
    public void run() 
        while (true) 
            if (count <= 0) 
                break;
            
            count--;
            num++;
            /*模拟网络延迟*/
            if (count == 10) 
                try 
                    Thread.sleep(100);
                 catch (InterruptedException e) 
                    e.printStackTrace();
                
            
            System.out.println(Thread.currentThread().getName()+"卖出第"+num+"张票");
        
    

    public static void main(String[] args) 
        ChePiao chePiao = new ChePiao();
        Thread t1 = new Thread(chePiao, "窗口1");
        Thread t2 = new Thread(chePiao, "窗口2");
        Thread t3 = new Thread(chePiao, "窗口3");
        t1.start();
        t2.start();
        t3.start();
    

运行结果:

技术图片

会出现这种情况,这是不正确的,因为同一张票只能出售一次,因此就需要引入同步机制

package com.zs.service;

public class ChePiao implements Runnable 
    private int count=50;//定义总共有50张票
    private int num = 0;//卖出第几张票
    @Override
    public void run() 

        while (true) 
            /**
             * synchronized 同步锁,将可能产生数据安全的代码锁起来,这样被锁起来的代码就会编程单线程
             * 两种解决同步安全问题:
             * 1.同步代码块
             * 2.同步方法  public synchronized void fun()..在返回值前加同步锁
             */
            synchronized (this) 
                if (count <= 0) 
                    break;
                
                count--;
                num++;
                System.out.println(Thread.currentThread().getName()+"卖出第"+num+"张票");
            
            /*模拟网络延迟*/
            if (count == 10) 
                try 
                    Thread.sleep(100);
                 catch (InterruptedException e) 
                    e.printStackTrace();
                
            

        
    

    public static void main(String[] args) 
        ChePiao chePiao = new ChePiao();
        Thread t1 = new Thread(chePiao, "窗口1");
        Thread t2 = new Thread(chePiao, "窗口2");
        Thread t3 = new Thread(chePiao, "窗口3");
        t1.start();
        t2.start();
        t3.start();
    

 

以上是关于java的多线程的主要内容,如果未能解决你的问题,请参考以下文章

VB中的多线程

什么是JAVA的多线程?

java中的多线程

关于Java的多线程

java编程:java的多线程是怎么实现的?高手进吧

Java中的多线程