zoukankan      html  css  js  c++  java
  • 关于多线程--网络编程 -- 注解反射的一点笔记(JAVA篇)

    一 . 线程

     java开启一个线程的方法(三种)

    方法一:继承Thread类并New一个线程对象

    步骤:

    1):定义一个类A继承于Java.lang.Thread类。

    class TestThread extends Thread

    2):在A类中覆盖Thread类中的run方法。

    3):在run方法中编写需要执行的操作。

    4):在main方法中,创建线程对象,并启动线程。

    //创建一个线程对象,并启动线程.  
    TestThread Lo = new TestThread();  
    Lo.start();  

    注:不要调用run方法,如果调用run方法好比是对象调用方法,依然还是只有一个线程,并没有开启新的线程,正确开启一个线程的是应该调用其Star方法。

    线程只能启动一次!

    代码示例:

    class TestThread extends Thread{  
        // 覆盖Thread类中的run方法.  
        public void run() {  
                System.out.println("阿龙");  
        }  
    }  
      
    public class ThreadDemo {  
        public static void main(String[] args) {        
                // 主线程
                System.out.println("运行游戏"+j);  
    
                // 再创建一个线程对象,并启动线程.  
                TestThread Lo = new TestThread();  
                Lo.start();   
        }  
    }

    方法二:实现Runnable接口(常用)

    步骤:

    1):定义一个类实现于java.lang.Runnable接口。

    2):在该类中重写run方法。

    3):重写run方法体内的操作。

    4):在main方法中,创建线程对象,并启动线程。

    代码示例:

    //定义一个类继承于java.lang.Runnable接口 
    class Lo implements Runnable{  
        //重写Runnable接口中的run方法.  
        public void run() {  
                System.out.println("Yes~");  
        }  
    }  
      
    public class Demo02 {  
        public static void main(String[] args) {  
                System.out.println("主线程");  
    
                //在main方法(线程)中,创建线程对象,并启动线程  
                Lo s = new Lo();  
                Thread t1 = new Thread(s);  
                t1.start();    
        }  
    } 

    方法三:实现Callable接口(不常用)

    注:Callable接口实际上是属于Executor框架中的功能类,Callable接口与Runnable接口的功能类似,但提供了比Runnable更加强大的功能,如下:

    1)Callable可以在任务结束的时候提供一个返回值,Runnable无法提供这个功能。

    2)Callable的call方法分可以抛出异常,而Runnable的run方法不能抛出异常。

    实现方法的步骤和runable差不多。

    public class CallableAndFuture {
        static class MyThread implements Callable<String> {
            @Override
            public String call() throws Exception {
                return "Hello world";
            }
        }
    
        public static void main(String[] args) {
            ExecutorService threadPool = Executors.newSingleThreadExecutor();
            Future<String> future = threadPool.submit(new MyThread());
    
            try {
                System.out.println(future.get());
            } catch (Exception e) {
    
            } finally {
                threadPool.shutdown();
            }
        }
    }

    补充:

    关于继承方式和实现方式的区别:

    继承方式:
    1):从设计上分析,Java中类是单继承的,如果继承了Thread了,该类就不能再有其他的直接父类了。

    2):从操作上分析,继承方式更简单,获取线程名字也简单.(操作上,更简单)。

    3):从多线程共享同一个资源上分析,继承方式不能做到。

    实现方式:
     1):从设计上分析,Java中类可以多实现接口,此时该类还可以继承其他类,并且还可以实现其他接口,设计更为合理。

     2):从操作上分析,实现方式稍微复杂点,获取线程名字也比较复杂,得使用Thread.currentThread()来获取当前线程的引用。

     3):从多线程共享同一个资源上分析,实现方式可以做到(是否共享同一个资源)。

     关于线程的常用方法。

    1)

    Thread.currentThead():获取当前线程对象

    2)  - - (优先级):线程优先级高,被CPU调度的概率大,但不代表一定会运行,还有小概率运行优先级低的线程。 

    getPriority():获取当前线程的优先级

    setPriority():设置当前线程的优先级

    3) 

    isAlive():判断线程是否处于活动状态 (线程调用start后,即处于活动状态)

    4)

    join():调用join方法的线程强制执行,其他线程处于阻塞状态,等该线程执行完后,其他线程再执行。有可能被外界中断产生InterruptedException 中断异常。比如:抢票软件的花钱买会员。

    5)

    sleep():在指定的毫秒数内让当前正在执行的线程休眠(暂停执行)。休眠的线程进入阻塞状态。

    6)  

    yield():调用yield方法的线程,会礼让其他线程先运行。(大概率其他线程先运行,小概率自己还会运行)- - 和join正好反义。

    7)  

    interrupt():中断线程

    8)  - - (wait方法一般配合另外两个方法一起使用。涉及到一个加锁与释放锁的概念,同时我记得还用过CountDownLatch 门栓机制) 

    以下方法多用于处理多线程的并发问题,比如双十一抢货,春节抢票等场景。。

    wait():导致线程等待,进入堵塞状态。该方法要在同步方法或者同步代码块中才使用的

    notify():唤醒当前线程,进入运行状态。该方法要在同步方法或者同步代码块中才使用的

    notifyAll():唤醒所有等待的线程。该方法要在同步方法或者同步代码块中才使用的

    线程同步的代码示例

    死锁问题

    剩下的明天再写。。

  • 相关阅读:
    Swagger介绍
    mybatis-plus常用操作
    [比赛][蓝桥杯] 第十一届蓝桥杯第二次省赛C++A组
    [题目][蓝桥杯PREV-14] 高僧斗法
    [题目][蓝桥杯PREV] 大合集
    [题目][APIO2009][蓝桥杯ALGO-44] 采油区域
    [题目][蓝桥杯ALGO] 大合集
    [题目][NOIP2001][蓝桥杯ALGO-25] Car 的旅行路线
    [题目][蓝桥杯ALGO-22] 数的划分
    [知识点] 1.5.3 运算符重载
  • 原文地址:https://www.cnblogs.com/WeiMLing/p/14008158.html
Copyright © 2011-2022 走看看