创建线程的三种方式

① 继承Thread类

/**
 * 不推荐的方式
 * 将要并行运行的任务与运行机制解耦合,用线程池解决
 */
class ExtendsMethod extends Thread {
    @Override
    public void run() {
        System.out.println("呵呵");
    }
    public static void main(String[] args) throws InterruptedException {
        Thread thread = new Thread(new ExtendsMethod());
        // 不要调用run方法(只会执行同一个线程中的任务)  应调用start
        thread.start();
    }
}

② 实现Runnable接口

public class ImplRunnable implements Runnable {
    @Override
    public void run() {
        System.out.println("哈哈");
    }
    public static void main(String[] args) {
        Thread thread = new Thread(new ImplRunnable());
        thread.start();
    }
}

③ 实现Callable接口

Callable与Runnable的区别:run does not return a result and cannot throw a checked execption

public class ImplCallable implements Callable<Integer> {
    // 重写call方法,该方法有返回值,有抛出异常
    @Override
    public Integer call() throws Exception {
        Thread.sleep(2000);
        return new Random().nextInt(10);
    }
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        // 缺点:创建对象方式繁琐
        // 创建线程对象
        ImplCallable ic = new ImplCallable();
        // 启动线程
        FutureTask<Integer> ft = new FutureTask<>(ic);
        Thread thread = new Thread(ft);
        thread.start();
        // 返回值自己获取(抛出异常)
        Integer i = ft.get();
        System.out.println(i);

    }
}

以下是实现③的实现过程:

底层:执行的时候state会从下面的几个变化,正常是0到1到2变化

FutureTask(implements RunnableFuture)源码:
private volatile int state;                    // 状态,正常状态是0 --> 1 --> 2  变化
    private static final int NEW          = 0;  // 调用构造器
    private static final int COMPLETING   = 1;  // 任务将要执行
    private static final int NORMAL       = 2;  // 任务正常执行结束
    private static final int EXCEPTIONAL  = 3;  // 异常
    private static final int CANCELLED    = 4;  // 线程取消
    private static final int INTERRUPTING = 5;  // 线程即将被中断
    private static final int INTERRUPTED  = 6;  // 中断线程

其中:

callable:任务

outcome:接收方法的返回值,下文提到 

(1)首先,调用构造器,传入Callable实现类

此时的状态为state = NEW == 0;

(2)其次,当任务被提交到线程池后,会执行futureTask的run()方法,详情看 FutureTask执行过程

public void run() {
        if (state != NEW ||
            !UNSAFE.compareAndSwapObject(this, runnerOffset,
                                         null, Thread.currentThread()))
            return;
        try {
            Callable<V> c = callable;
            if (c != null && state == NEW) {
                V result;                    ** 这边为传入的Integer即Random().nextInt(10)
                boolean ran;
                try {
                    result = c.call();
                    ran = true;
                } catch (Throwable ex) {
                    result = null;
                    ran = false;
                    setException(ex);
                }
                if (ran)
                    set(result);             ** 如果成功,调用set(产生的随机数)
            }
        } finally {
            // runner must be non-null until state is settled to
            // prevent concurrent calls to run()
            runner = null;
            // state must be re-read after nulling runner to prevent
            // leaked interrupts
            int s = state;
            if (s >= INTERRUPTING)
                handlePossibleCancellationInterrupt(s);
        }
    }

来到set,将传入的result赋值给outcome(上面提到,call方法的返回值),此时state = COMPLETING == 1(将要执行)

/**
     * Sets the result of this future to the given value unless
     * this future has already been set or has been cancelled.
     *
     * <p>This method is invoked internally by the {@link #run} method
     * upon successful completion of the computation.
     *
     * @param v the value
     */
    protected void set(V v) {
        if (UNSAFE.compareAndSwapInt(this, stateOffset, NEW, COMPLETING)) {
            outcome = v;
            UNSAFE.putOrderedInt(this, stateOffset, NORMAL); // final state
            finishCompletion();
        }
    }

此时,如果程序正常执行,state很快会变成NORMAL(2),若Runnable中call方法出现异常,则state会变成EXCEPTIONAL,详情请看 FutureTask执行过程

(3)最后,当我们调用get方法获取返回值,查看get方法

public V get() throws InterruptedException, ExecutionException {
        int s = state;                // 当state <= COMPLETING == 1 时,执行awaitDone
        if (s <= COMPLETING)            
            s = awaitDone(false, 0L);
        return report(s);             // 当state > 1 时,执行reports
}

其中:awaitDone方法,进入循环,直到state > 1
     
     reports方法:
            private V report(int s) throws ExecutionException {
                    Object x = outcome;
                    if (s == NORMAL)  // 当state == NORMAL == 2 时,返回结果outcome
                        return (V)x;
                    if (s >= CANCELLED)
                        throw new CancellationException();
                    throw new ExecutionException((Throwable)x);
            }

③的结论:get取值,阻塞是在 1 ---> 2之间,什么时候state == 2 ,什么时候返回给get

 

 

 

以下是对提供的参考资料的总结,按照要求结构化多个要点分条输出: 4G/5G无线网络优化与网规案例分析: NSA站点下终端掉4G问题:部分用户反馈NSA终端频繁掉4G,主要因终端主动发起SCGfail导致。分析显示,在信号较好的环境下,终端可能因节能、过热保护等原因主动释放连接。解决方案建议终端侧进行分析处理,尝试关闭节电开关等。 RSSI算法识别天馈遮挡:通过计算RSSI平均值及差值识别天馈遮挡,差值大于3dB则认定有遮挡。不同设备分组规则不同,如64T和32T。此方法可有效帮助现场人员识别因环境变化引起的网络问题。 5G 160M组网小区CA不生效:某5G站点开启100M+60M CA功能后,测试发现UE无法正常使用CA功能。问题原因在于CA频点集标识配置错误,修正后测试正常。 5G网络优化与策略: CCE映射方式优化:针对诺基亚站点覆盖农村区域,通过优化CCE资源映射方式(交织、非交织),提升RRC连接建立成功率和无线接通率。非交织方式相比交织方式有显著提升。 5G AAU两扇区组网:与三扇区组网相比,AAU两扇区组网在RSRP、SINR、下载速率和上传速率上表现不同,需根据具体场景选择适合的组网方式。 5G语音解决方案:包括沿用4G语音解决方案、EPS Fallback方案和VoNR方案。不同方案适用于不同的5G组网策略,如NSA和SA,并影响语音连续性和网络覆盖。 4G网络优化与资源利用: 4G室分设备利旧:面对4G网络投资压减与资源需求矛盾,提出利旧多维度调优策略,包括资源整合、统筹调配既有资源,以满足新增需求和提质增效。 宏站RRU设备1托N射灯:针对5G深度覆盖需求,研究使用宏站AAU结合1托N射灯方案,快速便捷地开通5G站点,提升深度覆盖能力。 基站与流程管理: 爱立信LTE基站邻区添加流程:未提供具体内容,但通常涉及邻区规划、参数配置、测试验证等步骤,以确保基站间顺畅切换和覆盖连续性。 网络规划与策略: 新高铁跨海大桥覆盖方案试点:虽未提供详细内容,但可推测涉及高铁跨海大桥区域的4G/5G网络覆盖规划,需考虑信号穿透、移动性管理、网络容量等因素。 总结: 提供的参考资料涵盖了4G/5G无线网络优化、网规案例分析、网络优化策略、资源利用、基站管理等多个方面。 通过具体案例分析,展示了无线网络优化中的常见问题及解决方案,如NSA终端掉4G、RSSI识别天馈遮挡、CA不生效等。 强调了5G网络优化与策略的重要性,包括CCE映射方式优化、5G语音解决方案、AAU扇区组网选择等。 提出了4G网络优化与资源利用的策略,如室分设备利旧、宏站RRU设备1托N射灯等。 基站与流程管理方面,提到了爱立信LTE基站邻区添加流程,但未给出具体细节。 新高铁跨海大桥覆盖方案试点展示了特殊场景下的网络规划需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值