Java多线程

程序 :一组命令的集合,完成指定功能,静态概念

进程 :正在运行的程序,是一个动态概念

线程 :进程的一个执行分支

并发:一个cpu同时执行多个任务

并行: 多个cpu同时执行多个任务

线程创建

两种方式,继承Thread类,实现Runnable接口。

public static void main(String[] args) {
		Thread t=new Thr();
		Thread thr=new Thread(new ThrR());
		//启动线程
		thr.start();
		t.start();
	}
class Thr extends Thread{
	@Override
	public void run() {
		System.out.println("创建线程方式一");
	}	
}
class ThrR implements Runnable{
	@Override
	public void run() {
		//要完成的任务
		System.out.println("创建线程方式二");
	}
	
}

优先级与常用方法

最大优先级为10,最小为1,默认为5

setPriority()设置线程优先级,要在start()方法之前使用,getPriority()获取线程优先级;getName()获取线程名字,setName()设置线程名字,不设置默认依次Thread-0,Thread-1...

静态方法 -- currentThread(),sleep(),在哪个线程调用,就获取这个线程对象或让这个线程睡眠

        //main的线程名字为main,currentThread()为静态方法,获取当前线程对象,在哪个线程中就获取那个线程对象
        System.out.println(Thread.currentThread().getName());
        Thread thr=new Thread(new ThrR());
        //设置优先级需要在启动之前,线程会继承父类的优先级,默认5
        thr.setPriority(9);
        //启动线程
        thr.start();

生命周期

新建状态(一个线程对象被分配并创建时),

就绪状态(调用start方法后,等待时间切片,可以运行,但是没有分到cpu的资源),

运行状态(线程被调度并获得cpu资源时),

阻塞状态(在特殊情况时,被认为挂起等,让出cpu终止自己的执行),

死亡状态(完成所有任务或提前被强制性终止或出现异常时)

线程控制方法

join()方法合并线程,将某线程与当前线程合并,等这个线程执行结束,再执行当前线程;

isAlive()方法判断线程是否结束;

yield()方法让出cpu,当前线程进入就绪状态等待调度;

stop()方法,终止线程执行,不推荐使用会导致死锁,可使用标识符解决

public class ThreadControl {
	public static void main(String[] args) throws InterruptedException {
		Thread thr = new Thread(new Sui());
//		Thread thr1 = new Thread(new Sui());
		thr.start();
//      执行完thr线程之后,主线程继续执行
//		thr.join();
//		thr1.start();
		for (int i = 0; i < 8; i++) {
			Thread.yield();
			System.out.println("zhuxiancheng");
		}
		
		Thread.sleep(2000);
		new Sui().flag=true;
//		thr.stop();
	}
}

class Sui implements Runnable {
	boolean flag=false;
	@Override
	public void run() {
		for (int i = 0; i < 5; i++) {
			if(flag) {
				System.out.println("停止运行");
			}
			System.out.println("suibianba");
		}
	}
}

线程同步

--需要用到锁机制

方法锁 -- synchronized修饰的静态方法叫类锁,synchronized修饰的成员方法叫对象锁

当某个线程访问某个对象中的synchronized修饰的方法时,此对象的所有synchronized修饰的方法都被锁住,都不能被访问操作,语句块锁同理,但语句块锁的效率比方法锁相对高一点

同步机制,效率相对较低,线程需要排队执行,但安全性较高,一致性有所保障

当多个线程同时操作同一个数据时,可能会导致数据的不一致,为了保护数据的一致性,需要同步执行,多线程同一时间对同一数据进行修改操作时需要同步数据。

三种,方法锁,语句块锁,Lock9(jdk5.0提供的线程同步机制)

//方法锁

    public synchronized void run() {
        s.getMoney();
    }

//语句块锁,相较于方法锁来说效率高        

synchronized (this) {
            s.setMoney();
        }

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;  

//Lock锁需要手动加锁与释放锁

 Lock lock=new ReentrantLock();
    
    public void setMoney() {
        lock.lock();
        System.out.println("方法锁存钱");
        lock.unlock();
    }

Lock锁与synchronized修饰的方法锁或语句块锁的区别:Lock锁需要显示的开启关闭锁,而synchronized锁是隐式锁,自动进行开启关闭锁;Lock锁只有代码块锁,synchronized锁除了代码块锁还有方法锁;Lock锁扩展性较好,花费较少的时间进行资源调度,性能相对较好

定时器任务

 定时器任务,到达时间后由这个线程来完成任

public class TimerTask_ {
	public static void main(String[] args) {
		Timer timer=new Timer();
		//第一个参数任务对象,2:开始时间,3:执行间隔时长
//		timer.schedule(new Task1(), new Date(System.currentTimeMillis()+1000), 5000);
		//第一个参数任务对象,2:多久之后开始,3:执行间隔时长
//		timer.schedule(new Task1(), 1000, 100);
	}
}
class Task1 extends TimerTask{

	@Override
	public void run() {
		System.out.println("任务");
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值