1:线程的概念 进程(任务):一个正在运行的程序 进程的调度:CPU来决定什么时候该运行哪个进程 (时间片轮流法) 1.2 线程和进程的关系 a:一个进程可以创建多个线程 b:线程必须依赖于进程而存在 c:多个线程共享进程的空间 d:进程和线程得到CPU的机会是均等的‘ 1.3 为什么要搞多线程 我们可以让程序同时执行(并发执行) //Java只让我们创建线程,而不让我们创建进程 HelloWorld.java javac HelloWorld.java java HelloWorld --->JVM 启动进程 Run Application --->JVM 启动进程 //一个进程中至少要有一个线程 main方法 被称为 主线程 2: 线程的创建方式 Thread 类 方式1:继承Thread类 1:自定义一个类,继承Thread类 2:重写Thread类的run方法 3:创建自定义类对象 4:让自定义类对象调用start方法,启动线程 class MyThread extends Thread{ public void run(){ //在此写你线程要执行的代码(木马查杀) } } //----------------- MyThread mt = new MyThread(); mt.start(); //启动线程----->系统会自动调用run方法 2.2 线程中的小方法 public static void sleep(long millis)//线程执行到该语句,就会休眠---》让出CPU public static void yield() // 线程的礼让 线程执行到该语句 线程会将CPU的执行权主动让出 // 让线程执行的更加均匀 public final void setPriority(int newPriority) //设置线程的优先级 创建线程的方式二:实现接口Runnable 步骤 : 1:自定义类实现Runnable接口 2:重写run方法 3: 创建自定义对象 4:创建Thread类对象,并将自定义类对象作为参数传入Thread类 5: 通过Thread类对象调用start方法启动线程 class MyRunnable implements Runnable { public void run(){ //线程要执行的内容 } } //---------------- MyRunnable mr = new MyRunnable(); Thread t = new Thread(mr); t.start();//启动线程,系统会自动执行MyRunnable中的run方法 3: 线程的同步(线程的安全) a:同一张票被卖了多次 b:出现了负票问题 线程的同步有三种实现方法: a: 同步代码块 b: 同步方法 c: Lock锁 3.1 同步代码块 synchronized (锁对象) //可以是任何一个对象,必须保证线程共享这个对象 { //存放你要加锁的代码 } 3.2 同步方法 //同步方法的锁对象是this //静态方法的锁对象是类的Class对象 public synchronized void sellTickets(){ } 3.3 两者的区别 synchronized (锁对象) { xxxxx yyyyy zzzzz sssss ttttt } public synchronized void sellTickets(){ xxxxx yyyyy zzzzz sssss ttttt } //--------------- public void method(){ xxxxx yyyyy synchronized (锁对象) { zzzzz sssss ttttt } } //同步方法,用户不能只指定锁对象,默认都是this //同步代码块,自己可以指定锁对象,锁对象可以是任何对象,只要线程共享即可 3.4 Lock锁 Lock: ReentrantLock lock(); 加锁 unlock(); 解锁 1:创建ReentrantLock对象 2:在适当的地方加锁 lock() 2:在适当的地方解锁 unlock();