01 多线程概念及其实现方式

  • 多线程是编程过程里必不可少的内容,学习多线程,就先要了解进程和线程的概念。
  • 进程:是指当前正在运行的程序,是一个程序在内存里的执行区域;
  • 线程:是在进程里的一个执行控制单元,执行路径;

 

实现多线程的方式有两种,一种是继承Thread类,一种是实现runnable接口。

1.继承Thread类

a) 根据API中的描述:创建新执行线程,继承Thread类方法是将类声明为 Thread 的子类。该子类应重写 Thread 类的 run 方法。

如下所示:

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

    }
}
  • getName()  方法用于 返回该线程的名称

 

b) 接下来可以分配并启动该子类的实例

如下所示:

    public static void main(String[] args) {
            ThreadDemo xc = new ThreadDemo();
            xc.setName("thread1");
            xc.start();

            ThreadDemo xc2= new ThreadDemo();
            xc2.setName("thread2");
            xc2.start();
    }
  • setName(String name)方法可以改变线程名称,使之与参数 name 相同
  • start()   方法使该线程开始执行;Java 虚拟机调用该线程的 run 方法

 

2.实现runnable接口

a) API中的描述是:创建线程的另一种方法是声明实现 Runnable 接口的类。该类然后实现 run 方法。然后可以分配该类的实例,在创建 Thread 时作为一个参数来传递并启动

如下所示:

public class RunableDemo implements  Runnable {
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println(Thread.currentThread().getName()+":"+i);
        }
    }
}
  • currentThread()我们实现了Runnable接口,接口里是没有getName方法的,所以如果我们想要获得到当前线程的基本信息,就需要用到Thread类的这个方法。API中描述:返回对当前正在执行的线程对象的引用,这个对象中是有getName()方法的。

b) 调用线程时,是使用Thread类,继承的对象作为一个参数传入

如下所示:

    public static void main(String[] args) {
            RunableDemo xc = new RunableDemo();
            Thread thread = new Thread(xc);
            thread.setName("thread1");
            thread.start();

            Thread thread2 = new Thread(xc);
            thread2.setName("thread2");
            thread2.start();
    }
  • RunableDemo 实现了Runnable接口,这个对象作为runnable类型的对象传入Thread类中
  • 最后通过start()方法进行启动,运行线程中的run()方法

 

 

在多线程中会出现需要同步操作的时候,例如扣费、减库存等,如果操作不用同步有可能导致库存为负数的情况。实现同步的方法如下:

1.同步代码块

关键字为synchronized,需要定义一把锁,这把锁需要所有的线程都共用,且锁可以为任意对象

代码如下:

//定义一把锁,在方法外以共用
Object obj = new Object();

public void tongbu(){    
      synchronized(obj){             
           System.out.println("同步代码块");
      }      
}    

 

2.同步方法

关键字也为synchronized

代码如下:

public synchronized void tongbu(){            
           System.out.println("同步方法");    
}   

 

注:同步方法的synchronized 也是有锁的,非静态方法调用的是类本身(this);静态方法因为加载在实体类之前,调用不到类本身,所以用到的是字节码对象(class类)

 

转载于:https://www.cnblogs.com/wlym/p/9684088.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值