【高频Java面试题】多线程

本文详细介绍了Java中创建线程的三种方式:继承Thread类、实现Runnable接口和使用Callable与Future接口。分析了它们的优缺点,强调了实现Runnable接口更适合资源共享。接着讨论了线程池的重要参数,如corePoolSize、maximumPoolSize等,并解释了乐观锁与悲观锁的概念和实现方式,以及CAS的优缺点和ABA问题。此外,还探讨了死锁的发生条件及解决方案,并讲述了如何查看非主线程的异常以及volatile关键字的作用和特性。
摘要由CSDN通过智能技术生成

1)问?说说多线程的几种创建方式?

概述

在JAVA中,用Thread类代表线程,所有线程对象,都必须是Thread类或者Thread类子类的实例。每个线程的任务就是执行一段顺序执行的代码,JAVA使用线程执行体来容纳这段代码。所以,我们创建线程时,主要是根据实际需求,编写放入线程执行体的代码

创建多线程的三种方式

一、通过继承Thread类创建线程类
 步骤如下:

1、定义一个类继承Thread类,并重写Thread类的run()方法,run()方法的方法体就是线程要完成的任务,因此把run()称为线程的执行体;

2、创建该类的实例对象,即创建了线程对象;

3、调用线程对象的start()方法来启动线程;

代码实现

public class ExtendThread extends Thread {
    private int i;
    public static void main(String[] args) {
        for (int j = 0;j < 50; j++){
            //调用Thread类的currentThread()方法获取当前线程
            System.out.println(Thread.currentThread().getName()+ "" + j);
            if(j==10){
                //创建并启动第一个线程
                new ExtendThread().start();
                //创建并启动第二个线程
                new ExtendThread().start();

            }
        }
    }

    @Override
    public void run() {
        for (;i<100;i++) {
            System.out.println(this.getName() + "" + i);
        }
    }
}

1、上述的getName()方法是返回当前线程的名字,也可以通过setName()方法设置当前线程的名字;

2、当JAVA程序运行后,程序至少会创建一个主线程(自动),主线程的线程执行体不是由run()方法确定的,而是由main()方法确定的;

3、在默认情况下,主线程的线程名字为main,用户创建的线程依次为Thread—1、Thread—2、....、Thread—3;

注意!!!

1、结果中有三个线程;分别是main、Thread-0 、Thread-1

2、Thread-0 、Thread-1两个线程输出的成员变量 i 的值不连续(这里的 i 是实例变量而不是局部变量)。因为:通过继承Thread类实现多线程时,每个线程的创建都要创建不同的子类对象,导致Thread-0 、Thread-1两个线程不能共享成员变量 i ;

3、线程的执行是抢占式,并没有说Thread-0 或者Thread-1一直占用CPU,与线程优先级有关

二、通过实现Runnable接口创建线程类

步骤:

1、定义一个类实现Runnable接口;

2、创建该类的实例对象obj;

3、将obj作为构造器参数传入Thread类实例对象,这个对象才是真正的线程对象;

4、调用线程对象的start()方法启动该线程;

public class ImpRunnable implements  Runnable {
    private int i;
    
    public void run() {
        for (;i<50;i++) {
            //当线程类实现Runnable接口时,要获取当前线程对象只有通过Thread.currentThread()获取
            System.out.println(Thread.currentThread().getName() + "" + i);
        }
    }
    public static void main(String[] args) {
        for (int j = 0 ;j < 30;j++){
            System.out.println(Thread.currentThread().getName() + "" + j);
            if (j ==10) {
                ImpRunnable thread_target = new ImpRunnable();
                //
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值