JAVA线程总结

线程与进程

进程

  • 指内存中的一段应用程序,每个进程都有一段独立的运行空间

线程

  • 是进程中的一个执行路径,共享一段内存空间,线程之间可以自由切换,并发执行。一个进程至少有一个线程
  • 线程是进程的进一步划分,一个进程启动后,里面的若干个执行路径可以划分为多个线程

线程调度

分时调度

  • 所有线程轮流使用 CPU 的使用权,平均分配每个线程占用 CPU 的时间。

抢占式调度

  • 优先让优先级高的线程使用 CPU,如果线程的优先级相同,那么会随机选择一个(线程随机性),

CPU在多个线程中高速切换,对于一个核心来说,某个时刻只能执行一个线程,由于速度切换的非常快,感觉是在同时执行,多线程不能提高速度,但能提高效率,让CPU利用率更高

同步与异步

同步为排队执行,效率低但安全

异步同时执行,效率高但不安全

并行与并发

并发 指两个或多个事件在同一个时间段发生的

并行 指两个或多个事件在同一时刻发生(同时发生)

 

Java中多线程的使用方法

  •  继承Thread类
class MyThread extends Thread{
    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println(Thread.currentThread().getName()+i);
        }
    }
}
public class demo {
    public static void main(String[] args) {
        MyThread thread = new MyThread();
        thread.start();
        for (int i = 0; i <10 ; i++) {
            System.out.println(Thread.currentThread().getName()+i);
        }
    }

}
  • 实现Runnable方法
class Myrunnable implements Runnable{

    @Override
    public void run() {
            for (int i = 0; i < 10; i++) {
                System.out.println(Thread.currentThread().getName()+i);
            }
    }
}

public class demo {
    public static void main(String[] args) {
        Myrunnable r= new Myrunnable();
        new Thread(r).start();
        for (int i = 0; i <10 ; i++) {
            System.out.println(i);
        }
    }
}

线程阻塞

使用interrupt()方法出发线程的InterruptException的异常处理模块。

守护线程

守护用户线程的

当最后一个用户线程结束,所有守护线程死亡

t.setDaemon(true)

线程安全问题

多个线程操作同一段代码致使变量出错的问题

解决方法

  • 同步代码块

Synchronized (锁对象){

}

锁对象可以是任何对象,打标记。

  • 同步方法

synchronized method(){


}

  • 显示锁(Lock)

首先创建锁

Lock lock = new ReentrantLock();

lock.lock()

{

}

lock.unlock()

注意事项,注意是否是同一把锁

公平锁和非公平锁

公平锁先来先到,线程排队

非公平锁大家一起抢

Lock lock = new ReentrantLock(true);

死锁问题

两个线程各拿着对方需要执行的代码块的锁,导致程序卡死问题

解决方法,在加锁的代码中,不要再调用其他加锁的代码

生产者与消费者问题

保证多线程之间的通信顺序问题

设置flag标志位

线程的六种状态 

NEW RUNNABLE BLOCKED WAITING TIMED WAITING TERMINATED

Callable

1. 编写类实现 Callable 接口 , 实现 call 方法
class XXX implements Callable<T> {
    @Override
    public <T> call() throws Exception {
        return T;
    }
}
2. 创建 FutureTask 对象 , 并传入第一步编写的 Callable 类对象
FutureTask<Integer> future = new FutureTask<>(callable);
3. 通过 Thread, 启动线程
new Thread(future).start();
Callalble 接口支持返回执行结果,需要调用 FutureTask.get() 得到,此方法会阻塞主进程的继续往下执 行,如果不调用不会阻塞。

线程池

       如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程 就会大大降低 系统的效率,因为频繁创建线程和销毁线程需要时间. 线程池就是一个容纳多个线程的容器,池中的线程可以反复使用,省去了频繁创建线程对象的操作,节省了大量的时间和资源。
  •  降低资源消耗
  •  提高相应速度
  •  提高线程的可管理性

缓存线程池

定长线程池

单线程线程池

周期性任务定长线程池

Lambda表达式

JDK8版本引入 

函数式编程

(参数)->{类方法}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值