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多线程(下)
首先介绍可见性.原子性.有序性.重排序这几个概念 原子性:即一个操作或多个操作要么全部执行并且执行的过程不会被任何因素打断,要么都不执行. 可见性:一个线程对共享变量值的修改,能够及时地被其它线程看到 ...
随机推荐
- 如何在Oracle网站获取官方免费课程
1.登陆Oracle Support,输入Article ID:740966.1,点击进行查找: 2.找到下图所示的文章,Article ID为:740964.1 3.点击第二个图中所示的Here处, ...
- 设计模式之Adapter(适配器模式)
1.出现原因: 在软件系统中,由于应用环境的变化,常常需要将“一些现存的对象”放在新的环境中应用,但是新环境要求的接口是这些现存对象所不满足的.(所以可以在他们之间建立一个适配器的中间类) 2.意图: ...
- VBS基础篇 - 常用函数
Option Explicit '*********************************Date/Time函数******************************* 'CDate函 ...
- 文本阴影text-shadow
文本阴影text-shadow text-shadow可以用来设置文本的阴影效果. 语法: text-shadow: X-Offset Y-Offset blur color; X-Offset:表示 ...
- netty 粘包问题处理
netty 粘包问题处理 key words: netty 粘包 解包 半包 TCP 一般TCP粘包/拆包解决办法 定长消息,例如每个报文长度固定,不够补空格 使用回车换行符分割,在包尾加上分割符,例 ...
- poj 1463 Strategic game
题目链接:http://poj.org/problem?id=1463 题意:给出一个无向图,每个节点只有一个父亲节点,可以有多个孩子节点,在一个节点上如果有一位战士守着,那么他可以守住和此节点相连的 ...
- 【递推】BZOJ 4300:绝世好题
4300: 绝世好题 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 564 Solved: 289[Submit][Status][Discuss] ...
- sample a texture as a rendertarget
ID3D11DeviceContext::PSSetShaderResources: Resource being set to PS shader resource slot 0 is still ...
- struct{0}二
一直以为 ]={};是把a的所有元素初始化为0,]={};是把a所有的元素初始化为1. 调试的时查看内存发现不是那么一回事,翻了一下<The C++ Programming Language&g ...
- [geeksforgeeks] Bottom View of a Binary Tree
http://www.geeksforgeeks.org/bottom-view-binary-tree/ Bottom View of a Binary Tree Given a Binary Tr ...