JAVA 多线程
Posted viperqy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA 多线程相关的知识,希望对你有一定的参考价值。
多线程
多线程介绍
进程: 正在运行的程序。一个应用程序在内存中的执行区域
线程:进程中的一个执行单元,执行路径。负责当前进程中程序的执行
一个进程可以有一个线程,也可以有多个线程
简而言之:一个程序运行后至少有一个进程,一个进程中可以包含多个线程
单线程:安全性高,效率低
多线程:安全性低,效率高
单线程程序:若有多个任务只能依次执行。当上一个任务执行结束后,下一个任务开始执行。如先刷牙然后再洗脸最后洗澡。
多线程程序:若有多个任务可以同时执行。如刷牙洗脸加洗澡。
创建线程的目的是什么?
是为了建立程序单独的执行路径,让多部分代码实现同时执行。也就是说线程创建并执行需要给定线程要执行的任务。
多线程的实现
方式一:
1.定义一个类继承Thread。
2.重写run方法。
3.创建子类对象,就是创建线程对象。
4.调用start方法,开启线程并让线程执行,同时还会告诉jvm去调用run方法
public class ThreadDemo01 public static void main(String[] args) //创建线程实例
Student s = new Student(); //修改线程名字 s.setName("wdnmd");
//启动线程 s.start(); Student s2 = new Student(); s2.setName("xswl"); s2.start(); class Student extends Thread @Override public void run() for (int i = 0; i < 100; i++) System.out.println(getName()+"---"+i);
方式二:
创建线程的另一种方法是声明实现 Runnable 接口的类。该类然后实现 run 方法。然后创建Runnable的子类对象,传入到某个线程的构造方法中,开启线程。
Runnable接口用来指定每个线程要执行的任务。包含了一个 run 的无参数抽象方法,需要由接口实现类重写该方法。
1、定义类实现Runnable接口。
2、覆盖接口中的run方法。。
3、创建Thread类的对象
4、将Runnable接口的子类对象作为参数传递给Thread类的构造函数。
5、调用Thread类的start方法开启线程。
public class MyThread implements Runnable int num; public MyThread(int num) this.num = num; @Override public void run() for (int i = 0; i < 100; i++) System.out.println( Thread.currentThread().getName() + "------"+ i +num );
public static void main(String[] args) MyThread mt = new MyThread(100); Thread t = new Thread(mt); t.setName("WDNMD"); t.start(); Thread t2 = new Thread(mt); t2.setName("XSWL"); t2.start();
同步代码块
格式: synchronized(锁对象) //需要同步的代码
synchronized:同步(锁),可以修饰代码块和方法,被修饰的代码块和方法一旦被某个线程访问,则直接锁住,其他的线程将无法访问
锁对象需要被所有的线程所共享
同步:安全性高,效率低
非同步:效率高,但是安全性低
同步方法:使用关键字synchronized修饰的方法,一旦被一个线程访问,则整个方法全部锁住,其他线程则无法访问
synchronized
注意:
非静态同步方法的锁对象是this
静态的同步方法的锁对象是当前类的字节码对象
public class TicketThread implements Runnable static int tickets = 100;//火车票数量 Object obj = new Object(); @Override public void run() //出售火车票 while(true) try Thread.sleep(100); catch (InterruptedException e) e.printStackTrace(); method(); private static synchronized void method() if(tickets > 0) System.out.println(Thread.currentThread().getName() + ":" +tickets--);
以上是关于JAVA 多线程的主要内容,如果未能解决你的问题,请参考以下文章