什么是线程,线程实现的方式哪个更好,线程的有哪几种状态,线程共享以及线程安全和如何解决线程安全问题

什么是线程

进程:

一个软件,在操作系统中,运行是,称之为进程。

线程:

在一个进程中,每一个独立的功能都需要独立的去运行,这时候需要把当前的进程划分多个运行区域,每一个小的区域(小单元)称为一个进程。
例如:杀毒软件中,同时可以安全体检电脑又可以清理电脑中的垃圾,其中安全体检就是一个进程,清理电脑中的垃圾也是一个线程。

多线程:

一个进程如果只有有一个执行任务,那么就是单线程程序。
一个进程如果有多条执行任务,也就是说在一个进程中,同时开启多个线程,让多个线程同时去完成某个任务,则是多线程。

线程的几种状态

1.新建(NEW):新创建了一个线程对象。
2.可运行(RUNNABLE):线程对象创建后,其他线程调用了该对象的start()方法,那么该线程将位于可运行线程池中等待被调用,获取cpu的使用权
3.运行(RUNNING):可运行状态的线程获得了cpu的时间片,执行程序代码。
4.阻塞(BLOCKED):阻塞状态是指线程因为某种原因放弃了cpu的使用权,暂时停止运行,知道线程进入可运行状态时,才有机会再次获得cpu的时间片,转到运行状态
(一). 等待阻塞:运行(running)的线程执行o.wait()方法,JVM会把该线程放入等待队列(waitting queue)中。
(二). 同步阻塞:运行(running)的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池(lock pool)中。
(三). 其他阻塞:运行(running)的线程执行Thread.sleep(long ms)或t.join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入可运行(runnable)状态。
5.死亡(DEAD):线程run(),main方法执行结束,或者因为异常退出了run()方法,则该线程结束生命周期,死亡的线程不再复生。

线程实现的方式,哪个更好?

方式一:继承thread,重写thread类中的run()方法。
方式二:实现Runnable接口,实现run方法。
方式二更好,
①避免了Java的单继承局限性。
②把线程代码和任务的代码分离,解耦合(解除线程代码和任务代码之间的依赖关系)。代码的扩展性非常好。
③使用接口可以更加方便灵活的实现数据共享。

继承thread
public class MyThread extends Thread {
    @Override
    public void run() {
        System.out.println("my thread .....");
    }
}
实现Runnable接口
public class MyThread2 implements Runnable {
    @Override
    public void run() {
        System.out.println("my 2222 ....");
    }
}

线程共享

当有一个线程在对内存进行操作时,其他线程都不可以对这个内存地址进行操作,直到该线程完成操作, 其他线程才能对该内存地址进行操作,而其他线程又处于等待状态

什么是线程安全问题

多线程环境中,且存在数据共享,一个线程访问的共享数据被其它线程修改了,那么就发生了线程安全问题;整个访问过程中,无一共享的数据被其他线程修改,就是线程安全的。
程序中如果使用成员变量,且对成员变量进行数据修改,就存现数据共享问题,也就是线程安全问题。

如何解决线程安全问题

1.使用线程同步机制,使得在同一个时间只能由一个线程修改共享数据。
2.消除线程共享数据:即多个线程不共享或者共享数据不进行修改。
使用局部变量,不使用成员变量。
如果使用成员变量,对成员变量不进行修改。

使用关键字synchronized 就可以进行线程同步

public synchronized void demo01(){
    //该方法只能被一个线程访问
}

public void demo02(String str){
    System.out.println("111");
    synchronized (str) {
        //该区域只能被一个线程访问
    }
    System.out.println("2222");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值