多线程的运行和APi介绍

多线程

1.使用多线程

1.1继承Thread类
public class MyThread extends Thread{
    
    public void run(){
        
    }
}

启动线程是使用:

new MyThread.start();
1.2实现Runnable接口
public class MyThread implements Runnable {
    
    public void run(){
        
    }
}

启动线程是使用:

new Thread(new MyThread).start();
1.3实现Callable接口
public class MyThread implements Callable {
    //重写call方法
    public boolean call(){
        return true;
    }
    
    public static void main(String[] arg){
        MyThread mythread =new Mythread();
        //创建执行服务,创建了3个服务线程
        ExecutorService ser = Executors.newFixedThreadPool(3);
        //提交执行
        Future<Boolean> result=ser.submit(mythread);
        //获取结果
        boolean r1=result.get();
        //关闭服务
        ser.shutdownNow();
    }
}
1.4Lamda表达式

1.前提是接口是函数式接口(接口里面只能有一个方法)。

2.Lamda表达式只能有一行代码的情况下才能简化成一行,如果有多行必须用代码块包裹着。

3.如果有多个参数,要简化参数,就去掉所有的参数。

new Thread(new MyThread).start();

new Thread(()->{System.out.println("Lamda表达式");}).start();

public class MyLamda{
	public static void main(String[] arg){
        //普通写
        LamdaInterFace lamda=new LamdaInterFace(){
            public void love(int a){
                System.out.println("实现LamdaInterFace接口的love方法"+a);
            }
        };
        //Lamda简化
        LamdaInterFace lamda=(int a)->{
            System.out.println("实现LamdaInterFace接口的love方法"+a);
        };
        //Lamda简化1:参数类型
        LamdaInterFace lamda=(a)->{
            System.out.println("实现LamdaInterFace接口的love方法"+a);
        };
        //Lamda简化2:括号
        LamdaInterFace lamda=a->{
            System.out.println("实现LamdaInterFace接口的love方法"+a);
        };
        //Lamda简化3:花括号
        LamdaInterFace lamda=a-> System.out.println("实现LamdaInterFace接口的love方法"+a);
    }
}

interface LamdaInterFace{
    void love(int a);
}

2. 多线程API

2.1 CurrentThread()方法

可返回代码块正在被那个线程调用

eg: Thread.currentThread().getName();

2.2 isAlive方法

判断当前线程是否存活

2.3 sleep()系列方法

sleep (long millis)

让该线程在指定的毫秒内,线程体眠,暂停

sleep(long millis,int nanos)

让该线程在指定的毫秒加上指定的纳秒内,线程体眠,暂停

2.4 StackTraceElement[] getStackTrace() 方法

返回一个表示该线程堆栈跟踪元素的数组

如果线程为启动或已终止,返回一个零长度的数组

如果返回的数组不是零长度的,则其第一个元素代表堆栈顶(最新的方法调用),最后一个元素表示堆栈底(最旧的方法调用)

2.5 static void dumpStack() 方法

将当前线程的堆栈跟踪信息输出至标准错误流,该方法仅用于调试。

2.6 getId()方法

取得线程的唯一标识

2.7 停止线程

使用退出标志终止线程(布尔值)

使用stop()方法强制终止线程(方法已被弃用),suspend()和resume()都是过期方法

使用interrupt()方法制终止线程

2.8 暂停线程

suspend()方法暂停线程

resume()方法恢复线程

缺点:可能会导致线程独占,数据不完整

建议使用wait(),notify(),notifyAll()方法

2.9 yieId()方法

放弃当前的cpu资源,让其他任务去占用CPU执行时间,放弃的时间不确定,可能刚刚放弃就马上获取CPU时间片

2.10 线程的优先级

使用**setPriority()**方法可以设置线程的优先级(1-10)

线程的优先级可继承:A线程里启动B线程,B线程的优先级和A线程的优先级是一样的

线程的优先级的随机性:不一定优先级高的就一定先运行

线程的优先级越高,运行速度就越快

2.11 守护线程

使用**setDaemon(true)**设置守护线程

java线程分两种:一种用户线程,非守护线程,一种守护线程

主线程main是用户线程

当用户线程销毁了,守护线程也随之销毁

备注

  • println()方法在内部是同步的。
  • 执行run()方法和start()方法是有区别的
    • 执行my.run()方法,主线程main立即执行,不会产生新的线程
    • 执行my.start()方法,执行run()方法的时间不确定,会产生新的线程
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值