关于Java线程,看这一篇就绝对够用了

Java线程的三种创建方式

继承Thread对象

class ThreadImpOne extends Thread{
        @Override
        public void run(){
            System.out.println("ThreadImpOne");
        }
 }

 

实现Runnalbe接口

class ThreadImpTwo implements Runnable{
    @Override
    public void run() {
        System.out.println("ThreadImpTwo");
    }
}

 

注意:光理论是不够的,在此送大家一套2020最新Java架构实战教程+大厂面试宝典,点击此处 进来获取 一起交流进步哦!

实现Callable接口
import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;
public class Main{
    public static void main(String args[]) throws Exception{
        ThreadImpThree threadThree = new ThreadImpThree();
        FutureTask<Integer> task = new FutureTask<Integer>(threadThree);
        new Thread(task).start();
        System.out.println(task.get());
    }
}
class ThreadImpThree implements Callable<Integer>{
    @Override
    public Integer call(){
        System.out.println("ThreadThreeImp");
        return 666;
    }
}
//ThreadThreeImp
//666

 

Java线程五种状态

新建状态(New): 线程对象被创建后,就进入了新建状态。Thread thread = new Thread()。

就绪状态(Runnable): 可执行状态,等待CPU调度。新建状态调用thread.start()就进入了就绪状态

运行状态(Running): 线程获取CPU时间进行执行

阻塞状态(Blocked): 由于某中原因,放弃CPU使用权,暂时停止运行。放弃的原因主要分为三种

等待阻塞:调用了同步对象的wait方法

同步阻塞:线程获取synchnoized同步锁失败,进入同步阻塞状态

其他阻塞:调用了线程的sleep、join方法或者发出了IO请求。sleep状态超时,join等待的线程执行完,或者I/O就绪时,线程会转入就绪状态

死亡状态(Dead):线程执行完,或者异常退出,线程就会进入死亡状态。

Java线程三种终止方式

修改标志位

比如在服务端程序中可能会使用 while(true) { ... }类似的循环结构来不断的接收来自客户端的请求。此时就可以用修改标志位的方式来结束 run() 方法的执行

while(!exit){
    doSomething();
}

 

stop方法终止线程

thread.stop()方法,可以立即终止线程,但是stop()方法不是安全的方法

调用 stop() 方法会立刻停止 run() 方法中剩余的全部工作,包括在 catch 或 finally 语句中的,并抛出ThreadDeath异常(通常情况下此异常不需要显示的捕获),因此可能会导致一些清理性的工作的得不到完成,如文件,数据库等的关闭。

interrupt方法
thread.interrupt方法,区别于stop方法,线程执行此方法后,会将线程的中断标志设置为true.
如果线程想响应中断,会进行中断操作,如果不想,就忽略此消息,线程的中断取决于线程本身。
public class Main{
    public static void main(String args[]) throws Exception{
        Thread thread = new Thread(new ThreadImp());
        thread.start();
        Thread.sleep(3000);
        thread.interrupt();
    }
}
class ThreadImp extends Thread{
    @Override
    public void run() {
        while(true) {
            System.out.println(Thread.interrupted());
            for(int i = 0; i < 100000; i++) {
                for(int j = 0; j < 50000; j++)
                {long value = Integer.MAX_VALUE * Integer.MAX_VALUE;}
            }
        }
    }
}
//线程一直会运行,肯定会有一次输出true

 

上面线程会一直运行,并且只会输出一次true,其余均为false,想了解原因的,可以详细阅读一下线程中断机制,这里就不赘述了。

注意:光理论是不够的,在此送大家一套2020最新Java架构实战教程+大厂面试宝典,添加小助手VX:xuanwo008免费领取

 

 

 

 

大厂月薪30k+面试宝典:

如何高效拿下 阿里,腾讯等八家大厂的offer的呢??收集了美团大神整理的Java核心知识点,面试时面试官必问的知识点

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值