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 多线程的主要内容,如果未能解决你的问题,请参考以下文章

什么是JAVA的多线程?

java中啥叫做线程?啥叫多线程?多线程的特点是啥

多线程Java多线程学习笔记 | 多线程基础知识

java中啥叫做线程?啥叫多线程?多线程的特点是啥?

Java+线程内部调用实例方法会多线程安全吗?

Java多线程 5.栅栏