zoukankan      html  css  js  c++  java
  • java多线程基础

    多线程的介绍

    进程与线程  

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

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

    创建线程的方式

    • 继承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() + "	卖出第:" + (number--) +
         * "	还剩下:" + number); } }
         */
        public  void saleTicket() {
            lock.lock();
            try {
            //这里使用if会出现虚假唤醒
            //多线程交互中,必须要防止多线程的虚假唤醒,也即(判断只用while,不用if)
    while(number > 0) { System.out.println(Thread.currentThread().getName() + " 卖出第:" + (number--) + " 还剩下:" + 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(); } }

    线程的状态

  • 相关阅读:
    EasyUI Datagrid换页不清出勾选方法
    【HDOJ】4902 Nice boat
    【HDOJ】1688 Sightseeing
    【HDOJ】3584 Cube
    【POJ】2155 Matrix
    【HDOJ】4109 Instrction Arrangement
    【HDOJ】3592 World Exhibition
    【POJ】2117 Electricity
    【HDOJ】4612 Warm up
    【HDOJ】2888 Check Corners
  • 原文地址:https://www.cnblogs.com/fengyangcai/p/12892655.html
Copyright © 2011-2022 走看看