Java:多线程

创建线程的方式有两种:

第一种:使用线程类Thread或者继承它的子类创建线程对象

第二种:定义接口类实现接口Runnable创建线程对象

多线程的好处:可以整合资源,提高系统资源的利用率

多线程中提供了同步方法、同步代码块以及加锁的方式实现多线程的同步

实现多线程:

classThread中有两个最重要的函数run()和start()。

1)    run()函数必须进行覆写,把要在多个线程中并行处理的代码放到这个函数中。

2)    虽然run()函数实现了多个线程的并行处理,但我们不能直接调用run()函数,而是通过调用start()函数来调用run()函数。在调用start()的时候,start()函数会首先进行与多线程相关的初始化(这也是为什么不能直接调用run()函数的原因),然后再调用run()函数。

一、简单的多线程举例如下:

需求:设计一个模拟用户从银行取款的应用程序。设某银行账户存款额的初值为2000元,用线程模拟两个用户分别从银行取款的情况。两个用户分4次分别从银行的同一账户取款,每次取100元。

//方式一:继承Thread,并在同步方法中实现多线程同步

class Bank        //定义银行类
{
    private static int Money=2000;
    public static synchronized void getmoney(int x)   //同步方法
       {
         Money = Money - x;
         try{Thread.sleep(10);}
         catch(InterruptedException e){};
         System.out.println(Thread.currentThread().getName()+"剩余存款是:"+Money+" 元");
       }
}
class Custom extends Thread     //定义线程类继承Thread
{
  public void run()
    {
      for(int i=0;i<4;i++)
         {
               Bank.getmoney(100);
         }
    }
}
class  CustomBank
{
    public static void main(String[] args)
    {
        Custom c1 = new Custom();   //创建两个线程c1、c2
        Custom c2 = new Custom();
        c1.start();
        c2.start();
    }
}

//方式二:继承Thread,并在同步代码块中实现多线程同步

class Bank        //定义银行类
{
    private static int Money=2000;
    public static void getmoney(int x)
       {
        synchronized(Bank.class) //同步代码块
           {
              Money = Money - x;
              try{Thread.sleep(10);}
              catch(InterruptedException e){};
              System.out.println(Thread.currentThread().getName()+"剩余存款是:"+Money+"元");
           }
       }
}
class Custom extends Thread     //定义线程类继承Thread
{
  public void run()
    {
      for(int i=0;i<4;i++)
         {
               Bank.getmoney(100);
         }
    }
}
class  CustomBank1
{
    public static void main(String[] args)
    {
        Custom c1 = new Custom();   //创建两个线程c1、c2
        Custom c2 = new Custom();
        c1.start();
        c2.start();
    }
}

//方式三:实现Runnable接口,在同步方法或同步代码块中实现多线程同步

class Bank        //定义银行类
{
    private int Money=2000;
    public synchronized void getmoney(int x) //同步方法
    {
            {
               Money=Money-x;
               try{Thread.sleep(10);}catch(Exception e){};
               System.out.println(Thread.currentThread().getName()+"剩余存款是:"+Money+" 元");
            }
    }
}

class Custom implements Runnable    //定义接口类实现接口Runnable
{
  private Bank b = new Bank();
  public void run()
    {
      for(int i=0;i<4;i++)
         {
           b.getmoney(100);
         }
    }
}
class  CustomBank2
{
    public static void main(String[] args)
    {
        Custom c = new Custom();
        Thread t1 = new Thread(c);
        Thread t2 = new Thread(c);
        t1.start();
        t2.start();
    }
}

二、线程的技巧性写法:利用匿名内部类创建互不相关的多个线程

class Demo3
{
    public static void main(String[] args)
    {
        //第一个线程
        new Thread()
        {
            public void run()
            {
                for(int i=0;i<10;i++)
                {
                    System.out.println(Thread.currentThread().getName()+"...."+i);
                }
            }

        }.start();

        //第二个线程
               for(int i=0;i<10;i++)
                {
                    System.out.println(Thread.currentThread().getName()+"...."+i);
                }

        //第三个线程
        Runnable r = new Runnable()
        {
            public void run()
            {
                for(int i=0;i<10;i++)
                {
                    System.out.println(Thread.currentThread().getName()+"...."+i);
                }
            }

        };
        new Thread(r).start();
    }
}

三、基本的线程的其他几种方法:

1、线程对象.setDaemon()   设置守护线程

2、线程对象.join()            等待该线程结束(顺序执行线程)

3、Thread.yield()              暂停当前正在执行的线程,执行其他的线程

4、线程对象.toStirng()      返回线程的名称、优先级、线程组

5、线程对象.setPriority()  设置线程的优先级

6、线程对象.getPriority()  获得线程的优先级

7、线程对象.interrupt()    中断当前线程

8、线程对象.isAlive()       判断线程是否正在运行

举例如下:

class DemoThread extends Thread
{
    public void run()
    {
      for(int i=0;i<20;i++)
        {
          try
          {
            Thread.sleep(10);
          }
          catch (InterruptedException e)
          {
              System.out.println(e.toString());
          }
          System.out.println(Thread.currentThread().getName()+"......"+i);
          //Thread.yield();
        }
    }
}
class Demo2
{
    public static void main(String[] args) throws InterruptedException
    {
        DemoThread t1 = new DemoThread();
        DemoThread t2 = new DemoThread();

        //t1.setPriority(Thread.MIN_PRIORITY);//t1.setPriority(1);
        //t2.setPriority(Thread.MAX_PRIORITY);//t2.setPriority(10);

        //t1.setDaemon(true);
        //t2.setDaemon(true);

        t1.start();
        //t1.join();
        //t1.interrupt();

        t2.start();
        //t2.join();
        //t2.interrupt();

        System.out.println("t1线程是否正在运行:"+t1.isAlive());
        System.out.println("t2线程是否正在运行:"+t2.isAlive());

        System.out.println("t1线程的优先级是:"+t1.getPriority());
        System.out.println("t2线程的优先级是:"+t2.getPriority());

        System.out.println("t1线程的名称、优先级、线程组"+t1.toString());
        System.out.println("t2线程的名称、优先级、线程组"+t2.toString());

        for(int i=0;i<10;i++)
        {
          System.out.println(Thread.currentThread().getName()+"......"+i);
        }
        System.out.println("over");
    }
}
时间: 2024-08-03 19:52:57

Java:多线程的相关文章

Java多线程系列--“JUC锁”11之 Semaphore信号量的原理和示例

概要 本章,我们对JUC包中的信号量Semaphore进行学习.内容包括:Semaphore简介Semaphore数据结构Semaphore源码分析(基于JDK1.7.0_40)Semaphore示例 转载请注明出处:http://www.cnblogs.com/skywang12345/p/3534050.html Semaphore简介 Semaphore是一个计数信号量,它的本质是一个"共享锁". 信号量维护了一个信号量许可集.线程可以通过调用acquire()来获取信号量的许可

从JAVA多线程理解到集群分布式和网络设计的浅析

对于JAVA多线程的应用非常广泛,现在的系统没有多线程几乎什么也做不了,很多时候我们在何种场合如何应用多线程成为一种首先需要选择的问题,另外关于java多线程的知识也是非常的多,本文中先介绍和说明一些常用的,在后续文章中如果有必要再说明更加复杂的吧,本文主要说明多线程的一下几个内容: 1.在应用开发中什么时候选择多线程? 2.多线程应该注意些什么? 3.状态转换控制,如何解决死锁? 4.如何设计一个具有可扩展性的多线程处理器? 5.多线程联想:在多主机下的扩展-集群? 6.WEB应用的多线程以及

java多线程心得

多并发的时候,在什么情况下必须加锁?如果不加锁会产生什么样的后果. 加锁的场景跟java的new thread和Runnable的关系是什么? 看看java的concurrentMap源码. 还有spring 的web.xml启动执行源码 spring aop http://www.cnblogs.com/FDROSE1001/p/3661895.html activemq的本质是什么? java的jms hibernate由配置文件映射到实体类的本质是什么? java反射 spring aop

Rhythmk 一步一步学 JAVA (21) JAVA 多线程

1.JAVA多线程简单示例 1.1 .Thread  集成接口 Runnable 1.2 .线程状态,可以通过  Thread.getState()获取线程状态: New (新创建) Runnable (可以运行) Blocked  (被阻塞) Waiting  (等待) Timed waiting (计时等待) Terminated  (被终止) ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27

(转载)Java多线程入门理解

转载出处http://blog.csdn.net/evankaka 写在前面的话:此文只能说是java多线程的一个入门,其实Java里头线程完全可以写一本书了,但是如果最基本的你都学掌握好,又怎么能更上一个台阶呢?如果你觉得此文很简单,那推荐你看看Java并发包的的线程池(Java并发编程与技术内幕:线程池深入理解),或者看这个专栏:Java并发编程与技术内幕.你将会对Java里头的高并发场景下的线程有更加深刻的理解. 目录(?)[-] 一扩展javalangThread类 二实现javalan

Java多线程系列--“JUC锁”02之 互斥锁ReentrantLock

ReentrantLock介绍 ReentrantLock是一个可重入的互斥锁,又被称为"独占锁". 顾名思义,ReentrantLock锁在同一个时间点只能被一个线程锁持有:而可重入的意思是,ReentrantLock锁,可以被单个线程多次获取.ReentrantLock分为"公平锁"和"非公平锁".它们的区别体现在获取锁的机制上是否公平."锁"是为了保护竞争资源,防止多个线程同时操作线程而出错,ReentrantLock在

synchronized与static synchronized 的差别、synchronized在JVM底层的实现原理及Java多线程锁理解

本Blog分为例如以下部分: 第一部分:synchronized与static synchronized 的差别 第二部分:JVM底层又是怎样实现synchronized的 第三部分:Java多线程锁,源码剖析 第一部分:synchronized与static synchronized的差别 1.synchronized与static synchronized 的差别 synchronized是对类的当前实例进行加锁,防止其它线程同一时候訪问该类的该实例的全部synchronized块.注意这里

深入聊聊Java多线程

一.背景 在没有学习Java多线程以前,总觉得多线程是个很神秘的东西,只有那些大神才能驾驭,新年假期没事就来学习和了解一下Java的多线程,本篇博客我们就来从头说一下多线程到底是怎么回事. 二.概述 1.进程的概念 每一个正在运行的程序都是一个进程,它是系统进行资源分配和调用的独立单位.且 每一个进程都有自己的内存空间和系统资源. 2.线程的概念 是进程中的单个顺序控制流,是一条执行路径.每个进程都可以拥有一个或者多个线程.各个线程之间都共享所属的那个进程的内存空间和系统资源. 3.单线程和多线

Java多线程 2 线程的生命周期和状态控制

一.线程的生命周期 线程状态转换图: 1.新建状态 用new关键字和Thread类或其子类建立一个线程对象后,该线程对象就处于新生状态.处于新生状态的线程有自己的内存空间,通过调用start方法进入就绪状态(runnable). 注意:不能对已经启动的线程再次调用start()方法,否则会出现Java.lang.IllegalThreadStateException异常. 2.就绪状态 处于就绪状态的线程已经具备了运行条件,但还没有分配到CPU,处于线程就绪队列(尽管是采用队列形式,事实上,把它

Java 多线程

多线程作为Java中很重要的一个知识点,在此还是有必要总结一下的. 一.线程的生命周期及五种基本状态 关于Java中线程的生命周期,首先看一下下面这张较为经典的图: 上图中基本上囊括了Java中多线程各重要知识点.掌握了上图中的各知识点,Java中的多线程也就基本上掌握了.主要包括: Java线程具有五中基本状态 新建状态(New):当线程对象对创建后,即进入了新建状态,如:Thread t = new MyThread(); 就绪状态(Runnable):当调用线程对象的start()方法(t