多线程
1.进程:是一个正在执行中的程序,每一个进程中都含有一个或多个控制单元(执行路径);
2.线程:进程中的一个独立的控制单元,一个进程中至少有一个线程;
3、多线程:一个进程中含有多个线程
单核和多核
单核:指单个cpu,其实是一种假的多线程,因为在一个时间单元,只能执行一个线程的任务
多核:指多个cpu(采用时间片),同时执行多个任务
并行、串行、并发
并行:指的是多个cpu(多核)同时处理多个任务
串行:指的是多个任务,执行一个任务完成后,在执行另一个任务
并发:指的是一个cpu(采用时间片)同时执行多个任务
特点
1、更好的利用cpu资源,创建线程的代价比较小
2、进程之间不能共享数据,但线程可以
线程的生命周期
线程的方法:
isAilve() : 判断线程是否还活着,
getPriority():获得线程优先级数据
setPriority():设置线程优先级数据
Thread.sleep():将当前线程睡眠指定毫秒数
join():将该线程的时间片让渡给另一个线程,等另一个线程结束,在运行该线程
yield():让出cpu,当前线程进入等待
wait():当前线程进入对象的wait pool
notify()/notifyAll():唤醒对象的wait pool中的一个/所有等待线程
同步 synchronized :
线程的同步有三种方式:
-
Synchronized代码块:使用Synchronized代码块时,我们要可以让任意一个对象或类充当锁,
-
Synchronized方法:Synchronized方法时,在静态方法中系统默认调用当前类充当锁,在非静态方法只能系统默认当前对象充当锁。
-
Lock锁:在Lock锁中我们会创建一个Reentrant Lock 类实例来充当锁。通过lock()开启锁,unlock()关闭锁。
线程的同步详解:
Synchronized代码块,Synchronized方法锁的开启和关闭是自动的 ,隐式的。而Lock是显式的。
Thread // main 方法所在的方法是主线程
// 3.开启线程
MyThread myThread = new MyThread("线程1");
// 通过 start() 调用 run()方法开启新线程
myThread.start();
MyThread2 myThread2 = new MyThread2("线程2");
// 通过 start() 调用 run()方法开启新线程
myThread2.start();
// 主线程main
for ( int i=0;i<1000;i++){
System.out.println("++++++++++"+Thread.currentThread().getName());
}
}
}
/*
同步---资源共享
*/
// 1.继承Thread
class MyThread extends Thread{
// 重写构造方法
public MyThread(String name){
super(name);
}
static int count = 0;
// 2.重写 run()方法
public void run(){
for (int i = 0;i<1000;i++){
// Thread.currentThread().getName() 获取当前线程的名称
System.out.println((count++)+"~~~~~~~"+Thread.currentThread().getName());
}
}
}
// 在创建新线程- - 2
class MyThread2 extends Thread{
public MyThread2(String name){
super(name);
}
// 2.重写 run()方法
public void run(){
for (int i = 0;i<1000;i++){
// Thread.currentThread().getName() 获取当前线程的名称
System.out.println("------------"+Thread.currentThread().getName());
}
}
}
// 3.开启线程
MyThread myThread = new MyThread("线程1");
// 通过 start() 调用 run()方法开启新线程
myThread.start();
MyThread2 myThread2 = new MyThread2("线程2");
// 通过 start() 调用 run()方法开启新线程
myThread2.start();
// 主线程main
for ( int i=0;i<1000;i++){
System.out.println("++++++++++"+Thread.currentThread().getName());
}
}
}
/*
同步---资源共享
*/
// 1.继承Thread
class MyThread extends Thread{
// 重写构造方法
public MyThread(String name){
super(name);
}
static int count = 0;
// 2.重写 run()方法
public void run(){
for (int i = 0;i<1000;i++){
// Thread.currentThread().getName() 获取当前线程的名称
System.out.println((count++)+"~~~~~~~"+Thread.currentThread().getName());
}
}
}
// 在创建新线程- - 2
class MyThread2 extends Thread{
public MyThread2(String name){
super(name);
}
// 2.重写 run()方法
public void run(){
for (int i = 0;i<1000;i++){
// Thread.currentThread().getName() 获取当前线程的名称
System.out.println("------------"+Thread.currentThread().getName());
}
}
}
Ruannable
// 创建新线程 ---接口
MvTh mvTh = new MvTh();
// 使用Thread 方法
Thread thread = new Thread(mvTh);
thread.start(); // 开启新线程
// 主线程
for (int i =0;i<1000;i++){
System.out.println("+++++++++"+Thread.currentThread().getName());
}
}
}
// 主要实现资源的共享
class MvTh implements Runnable{
int count=0;
// 重写run抽象方法
public void run(){
for (int i =0;i<1000;i++){
System.out.println((count++)+"-------"+Thread.currentThread().getName());
}
}
}
MvTh mvTh = new MvTh();
// 使用Thread 方法
Thread thread = new Thread(mvTh);
thread.start(); // 开启新线程
// 主线程
for (int i =0;i<1000;i++){
System.out.println("+++++++++"+Thread.currentThread().getName());
}
}
}
// 主要实现资源的共享
class MvTh implements Runnable{
int count=0;
// 重写run抽象方法
public void run(){
for (int i =0;i<1000;i++){
System.out.println((count++)+"-------"+Thread.currentThread().getName());
}
}
}
全部评论
(0) 回帖