码迷,mamicode.com
首页 > 编程语言 > 详细

java多线程基础

时间:2020-05-15 09:50:41      阅读:54      评论:0      收藏:0      [点我收藏+]

标签:进入   exec   syn   http   ++   adp   runable   ted   方法   

多线程的介绍

进程与线程  

进程:进程指正在运行的程序。确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能。

线程:线程是进程中的一个执行单元,我们程序中的代码都是由线程来执行的,一个进程中至少有一个线程。一个进程中是可以有多个线程的,这个应用程序也可以称之为多线程程序。

创建线程的方式

  • 继承Thread,重写run方法
  • 实现Runable接口,实现run方法,
  • 实现Callable接口的call方法,使用Futrue包装Callable接口。
  • 使用线程池创建线程。

代码:

/**
 * 
 * @author admin
 * 线程创建一般有四种方式
 *
 */
class MyThreadDemo1 extends Thread{
    //重写run方法
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName()+"--继承Thread的创建线程方式");
        
    }
       
}
class MyTheadDemo2 implements Runnable{
    //实现run方法
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName()+"--Runnable的创建线程方式");
    }
    
}
//实现Callable接口
//1.创建Callable接口的实现类,并实现call()方法
//2.创建Callable实现类的实例,使用FutureTask类来包装Callable对象,该FutureTask对象封装了该Callable对象的call()方法的返回值。
//3.使用FutureTask对象作为Thread对象的target创建并启动新线程。
//4.调用FutureTask对象的get()方法来获得子线程执行结束后的返回值
class MyThreadDemo3 implements Callable<Object>{

    @Override
    public Object call() throws Exception {
        System.out.println(Thread.currentThread().getName()+"--callable的创建线程方式");
        return null;
    }
    
}

public class MyThread1 {
    
    public static void main(String[] args) {
        //使用匿名类调用                            
        new Thread(new MyThreadDemo1()).start();
        new Thread(new MyTheadDemo2()).start();
        new Thread(new MyTheadDemo2()).start();
        
        //callable的
        FutureTask<Object> futureTask = new FutureTask<Object>(new MyThreadDemo3());
        new Thread(futureTask).start();
        
        //使用线程池创建线程
        ExecutorService newFixedThreadPool = Executors.newFixedThreadPool(3);
        System.out.println(newFixedThreadPool);
        newFixedThreadPool.submit(new MyTheadDemo2());
        newFixedThreadPool.submit(futureTask);
        
        
                
    }
    

}

 使用匿名内部类创建模拟买票class Ticket {// 资源类    private int number = 30;

  //ReentrantLock请查看文档说明
    private Lock lock=new ReentrantLock();

    /*
     * public synchronized void saleTicket() { if (number > 0) {
     * 
     * System.out.println(Thread.currentThread().getName() + "\t卖出第:" + (number--) +
     * "\t还剩下:" + number); } }
     */
    public  void saleTicket() {
        lock.lock();
        try {
        //这里使用if会出现虚假唤醒
        //多线程交互中,必须要防止多线程的虚假唤醒,也即(判断只用while,不用if)
while(number > 0) { System.out.println(Thread.currentThread().getName() + "\t卖出第:" + (number--) + "\t还剩下:" + number); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); }finally { lock.unlock(); } } } /** * * @author admin 多线程的编程就是 在高内聚低耦合的前提下,使用线程 操作(对外暴露的调用方法) 资源类/ * */ public class MyThread2 { public static void main(String[] args) { Ticket ticket = new Ticket(); // 使用lamber表达式创建 /* * new Thread(()->{ ticket.saleTicket(); },"aa").start(); } */new Thread(new Runnable() { @Override public void run() { for (int i = 0; i < 40; i++) { ticket.saleTicket(); } } },"aa").start(); new Thread(new Runnable() { @Override public void run() { for (int i = 0; i < 40; i++) { ticket.saleTicket(); } } },"bb").start(); } }

线程的状态

技术图片

 

java多线程基础

标签:进入   exec   syn   http   ++   adp   runable   ted   方法   

原文地址:https://www.cnblogs.com/fengyangcai/p/12892655.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!