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");
}
}
Java:多线程的更多相关文章
- 40个Java多线程问题总结
前言 Java多线程分类中写了21篇多线程的文章,21篇文章的内容很多,个人认为,学习,内容越多.越杂的知识,越需要进行深刻的总结,这样才能记忆深刻,将知识变成自己的.这篇文章主要是对多线程的问题进行 ...
- Java多线程基础知识篇
这篇是Java多线程基本用法的一个总结. 本篇文章会从一下几个方面来说明Java多线程的基本用法: 如何使用多线程 如何得到多线程的一些信息 如何停止线程 如何暂停线程 线程的一些其他用法 所有的代码 ...
- Java多线程系列--“JUC锁”03之 公平锁(一)
概要 本章对“公平锁”的获取锁机制进行介绍(本文的公平锁指的是互斥锁的公平锁),内容包括:基本概念ReentrantLock数据结构参考代码获取公平锁(基于JDK1.7.0_40)一. tryAcqu ...
- Java多线程系列--“JUC锁”04之 公平锁(二)
概要 前面一章,我们学习了“公平锁”获取锁的详细流程:这里,我们再来看看“公平锁”释放锁的过程.内容包括:参考代码释放公平锁(基于JDK1.7.0_40) “公平锁”的获取过程请参考“Java多线程系 ...
- Java多线程--让主线程等待子线程执行完毕
使用Java多线程编程时经常遇到主线程需要等待子线程执行完成以后才能继续执行,那么接下来介绍一种简单的方式使主线程等待. java.util.concurrent.CountDownLatch 使用c ...
- Java多线程 2 线程的生命周期和状态控制
一.线程的生命周期 线程状态转换图: 1.新建状态 用new关键字和Thread类或其子类建立一个线程对象后,该线程对象就处于新生状态.处于新生状态的线程有自己的内存空间,通过调用start方法进入就 ...
- java 多线程 1 线程 进程
Java多线程(一).多线程的基本概念和使用 2012-09-10 16:06 5108人阅读 评论(0) 收藏 举报 分类: javaSE综合知识点(14) 版权声明:本文为博主原创文章,未经博 ...
- 一起阅读《Java多线程编程核心技术》
目录 第一章 Java多线程技能 (待续...)
- 第一章 Java多线程技能
1.初步了解"进程"."线程"."多线程" 说到多线程,大多都会联系到"进程"和"线程".那么这两者 ...
- java从基础知识(十)java多线程(下)
首先介绍可见性.原子性.有序性.重排序这几个概念 原子性:即一个操作或多个操作要么全部执行并且执行的过程不会被任何因素打断,要么都不执行. 可见性:一个线程对共享变量值的修改,能够及时地被其它线程看到 ...
随机推荐
- SQL SERVER定时任务执行跟踪--供远程查看 [原创]
一.背景 每次查需要优化的SQL都需要上外网,通过Profiler,报表或者DMV执行特定sql来查找,来回跑很麻烦,能不能在本地直接监控外网的好性能的SQL呢?方法是有的,我们可以通过把Profil ...
- Spring 静态资源配置
ShineJaie 原创整理,转载请注明出处. 一.为何要配置静态资源 1.在配置 Spring 的时候,我们配置的拦截是"/",即任何文件都会经 Spring 拦截处理. 2.实 ...
- hibernate---table_Generator
首先讲一下调试技巧:: @javax.persistence.TableGenerator( name="Teacher_GEN", table="GENERATOR_T ...
- 开始学习C++ Templates
设计模式的学习以及各种设计模式的C++实现已经告一段落了,解释器模式和迭代器模式,以及模版办法简单的看了一下. 画UML图的时候再重点学习 从今天开始学习Templates.
- if-else的优化举例
共有部分: String bookFrom = null; String sheetFrom = null; String bookTo = null; String sheetTo = null; ...
- 客户端发包 GS端接收
客户端发包,GS接收 bool GameServer::ProcessLoop(packet& rPkt)//GS线程做的 { if(false == m_spDataLayer->Re ...
- Apache环境.htaccess伪静态301跳转(www与不带www)
一般而言,我们使用的301跳转就是WWW与不带WWW域名之间的跳转,用行话说就是权重要归一.对于我们使用Apache环境的来说其实相对nginx比较简单,因为只需要我们在网站根目录有.htaccess ...
- My97日历控件常用功能记录
My97相信大家都不陌生,应该是我所见过的最强大的一个日历控件了,最近的项目中也比较多地用到了此控件,而且项目中经常会有不同时间范围的需求,在此列出一些比较常用的日期范围格式的设置,尽管在My97的官 ...
- ftp命令和scp命令
ftp命令: 服务器有安装ftp Server,另外一台linux可以使用ftp的client程序来进行文件的拷贝读取和下载. 1. 连接ftp服务器 格式:ftp [hostname| ip-ad ...
- Linux关于watch的用法
Linux关于watch的用法 2011-07-20 0个评论 收藏 我要投稿 watch 是一个非常实用的命令,基本所有的 Linux 发行版都带有这个小工具,如同名字一 ...