创建线程的方式有两种:

第一种:使用线程类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");
}
}

Java:多线程的更多相关文章

  1. 40个Java多线程问题总结

    前言 Java多线程分类中写了21篇多线程的文章,21篇文章的内容很多,个人认为,学习,内容越多.越杂的知识,越需要进行深刻的总结,这样才能记忆深刻,将知识变成自己的.这篇文章主要是对多线程的问题进行 ...

  2. Java多线程基础知识篇

    这篇是Java多线程基本用法的一个总结. 本篇文章会从一下几个方面来说明Java多线程的基本用法: 如何使用多线程 如何得到多线程的一些信息 如何停止线程 如何暂停线程 线程的一些其他用法 所有的代码 ...

  3. Java多线程系列--“JUC锁”03之 公平锁(一)

    概要 本章对“公平锁”的获取锁机制进行介绍(本文的公平锁指的是互斥锁的公平锁),内容包括:基本概念ReentrantLock数据结构参考代码获取公平锁(基于JDK1.7.0_40)一. tryAcqu ...

  4. Java多线程系列--“JUC锁”04之 公平锁(二)

    概要 前面一章,我们学习了“公平锁”获取锁的详细流程:这里,我们再来看看“公平锁”释放锁的过程.内容包括:参考代码释放公平锁(基于JDK1.7.0_40) “公平锁”的获取过程请参考“Java多线程系 ...

  5. Java多线程--让主线程等待子线程执行完毕

    使用Java多线程编程时经常遇到主线程需要等待子线程执行完成以后才能继续执行,那么接下来介绍一种简单的方式使主线程等待. java.util.concurrent.CountDownLatch 使用c ...

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

    一.线程的生命周期 线程状态转换图: 1.新建状态 用new关键字和Thread类或其子类建立一个线程对象后,该线程对象就处于新生状态.处于新生状态的线程有自己的内存空间,通过调用start方法进入就 ...

  7. java 多线程 1 线程 进程

    Java多线程(一).多线程的基本概念和使用 2012-09-10 16:06 5108人阅读 评论(0) 收藏 举报  分类: javaSE综合知识点(14)  版权声明:本文为博主原创文章,未经博 ...

  8. 一起阅读《Java多线程编程核心技术》

    目录 第一章 Java多线程技能 (待续...)

  9. 第一章 Java多线程技能

    1.初步了解"进程"."线程"."多线程" 说到多线程,大多都会联系到"进程"和"线程".那么这两者 ...

  10. java从基础知识(十)java多线程(下)

    首先介绍可见性.原子性.有序性.重排序这几个概念 原子性:即一个操作或多个操作要么全部执行并且执行的过程不会被任何因素打断,要么都不执行. 可见性:一个线程对共享变量值的修改,能够及时地被其它线程看到 ...

随机推荐

  1. Android -- TouchEvent的分发和截获方式

    Android系统中的每个ViewGroup的子类都具有下面三个和TouchEvent处理密切相关的方法: public boolean dispatchTouchEvent(MotionEvent ...

  2. 丢掉 WinPE,使用 DISKPART 来分区吧

    自 Windows Vista 之后的操作系统,如果在安装系统的时候使用 Windows 自带的分区功能,则会多出一个 100M 的系统保留分区.这会让一个物理硬盘,原先最多可以分 4 个主分区的,现 ...

  3. 随笔 planetest

    Camera跟随物体: import Scripts包,Component中的camera control会有smooth follow脚本,添加到Main Camera中,在脚本的target属性中 ...

  4. 向Array中添加快速排序

    快速排序思路 1) 假设第一个元素为基准元素 2) 把所有比基准元素小的记录放置在前一部分,把所有比基准元素大的记录放置在后一部分,并把基准元素放在这两部分的中间(i=j的位置) 快速排序实现 Fun ...

  5. MySQL基本概念

    MySQL 数据库 MySQL可分为三个层次:文件层次,服务层次,界面 常用的数据类型:int 整数float double decimal ——小数(要在十进位栏里设置小数点后最大显示位数)varc ...

  6. WWDC2014 debugging_in_xcode_6 总结

    1.GCD的waiting queue 可以在Xcode左侧的面板中查看. 2.可以对View进行debug类似reveal. 3.查看运行时的对象,对于自定义对象可以实现- (id)debugQui ...

  7. UVALive - 7368 Airports DAG图的最小路径覆盖

    题目链接: http://acm.hust.edu.cn/vjudge/problem/356788 Airports Time Limit: 3000MS 问题描述 An airline compa ...

  8. POSIX 线程详解 一种支持内存共享的简捷工具

    线程是有趣的 了解如何正确运用线程是每一个优秀程序员必备的素质.线程类似于进程.如同进程,线程由内核按时间分片进行管理.在单处理器系统中,内核使用时间分片来模拟线程的并发执行,这种方式和进程的相同.而 ...

  9. 使用Ninject+Moq在单元测试中抽象数据访问层

    一.测试方法的业务逻辑时,通常都需要从数据库读取测试数据,但是每次初始化数据库数据都很麻烦,也会影响到其它业务对数据的访问,怎样抽象数据访问层呢?就是用Moq去模拟数据访问的逻辑     二.步骤如下 ...

  10. Core Data 版本数据迁移

    Core Data版本迁移基础 通常,在使用Core Data的iOS App上,不同版本上的数据模型变更引发的数据迁移都是由Core Data来负责完成的.这种数据迁移模式称为Lightweight ...