Java学习随笔5:Java多线程编程
1. 线程是程序中单独顺序的控制流,线程本身依靠程序进行运行,线程是程序中的顺序控制流,只能使用分配给程序的资源和环境。
2. 进程是执行中的程序,一个进程可以包含一个或多个线程,但至少要包含一个线程。
3. 单线程是程序中只存在一个线程,实际上主方法就是一个主线程;多线程是在一个程序中运行多个任务,其目的是更好的使用CPU资源。
4. 在Java中,线程的实现有两种:继承Thread类和实现Runnable接口。Thread类是在java.lang包中定义的,继承Thread类必须重写run()方法。
例1:继承Thread类的线程
class MyThread extends Thread{
private String name;
public MyThread(String name){
this.name = name;
}
@Override
public void run() {
for(int i = 0; i < 10; i++){
System.out.println(name+":"+i);
}
super.run();
}
}
public class ThreadDemo01 {
public static void main(String[] args) {
MyThread t1 = new MyThread("A");
MyThread t2 = new MyThread("B");
// 线程的启动是通过start方法
t1.start();
t2.start();
}
}
例2:实现Runnable接口
class MyRunnable implements Runnable{
private String name;
public MyRunnable(String name){
this.name = name;
}
@Override
public void run() {
for(int i = 0; i < 100; i++){
System.out.println(name+":"+i);
}
}
}
public class ThreadDemo02 {
public static void main(String[] args) {
MyRunnable r1 = new MyRunnable("A");
MyRunnable r2 = new MyRunnable("B");
Thread t1 = new Thread(r1);
Thread t2 = new Thread(r2);
t1.start();
t2.start();
}
}
5. 线程的状态
(1) 创建状态:准备好了一个多线程的对象
(2) 就绪状态:调用了start()方法,等待CPU进行调度
(3) 运行状态:执行run()方法
(4) 阻塞状态:暂时停止执行,可能将资源交给其他线程使用
(5) 终止状态:线程销毁
6. 线程的常用方法
(1) getName():取得线程名称
(2) currentThread():取得当前线程对象
(3) isAlive():判断线程是否启动
(4) join():线程的强制运行
(5) sleep():线程的休眠
(6) yield():线程的礼让
例1:前五种方法的使用:
class RunnableDemo implements Runnable{
private String name;
public RunnableDemo(String name){
this.name = name;
}
public void run(){
for(int i = 0; i < 10; i++){
try {
// 1s执行一次
Thread.sleep(1000);
System.out.println(name+":"+Thread.currentThread().getName());
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
public class ThreadDemo03 {
public static void main(String[] args) {
RunnableDemo rd1 = new RunnableDemo("A");
Thread t1 = new Thread(rd1);
//System.out.println(t1.isAlive());
t1.start();
//System.out.println(t1.isAlive());
// 强行执行
for(int i = 0; i < 10; i++){
if(i > 5){
try {
t1.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("主线程:"+i);
}
RunnableDemo rd2 = new RunnableDemo("B");
Thread t2 = new Thread(rd2);
t2.start();
}
}
其结果为:
主线程:0
主线程:1
主线程:2
主线程:3
主线程:4
主线程:5
A:Thread-0
A:Thread-0
A:Thread-0
A:Thread-0
A:Thread-0
A:Thread-0
A:Thread-0
A:Thread-0
A:Thread-0
A:Thread-0
主线程:6
主线程:7
主线程:8
主线程:9
B:Thread-1
B:Thread-1
B:Thread-1
B:Thread-1
B:Thread-1
B:Thread-1
B:Thread-1
B:Thread-1
B:Thread-1
B:Thread-1
例2:礼让的使用
class RunnableDemo02 implements Runnable{
private String name;
public RunnableDemo02(String name){
this.name = name;
}
@Override
public void run(){
for(int i = 0; i < 10; i++){
System.out.println(name+":"+i);
if(i == 4){
System.out.println("礼让");
// 线程的礼让
Thread.yield();
}
}
}
}
public class ThreadDemo04 {
public static void main(String[] args) {
RunnableDemo02 r1 = new RunnableDemo02("A");
RunnableDemo02 r2 = new RunnableDemo02("B");
Thread t1 = new Thread(r1);
Thread t2 = new Thread(r2);
t1.start();
t2.start();
}
}
7. 线程的优先级,不一定会影响线程的执行顺序
优先级顺序设置:1-MIN-PRIORITY; 10-MAX-PRIORITY; 5-NORM-PRIORITY,默认值是5。
class RunnableDemo03 implements Runnable{
@Override
public void run() {
for(int i = 0; i < 5; i++){
try {
Thread.sleep(1000);
System.out.println(Thread.currentThread().getName()+":"+i);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class ThreadDemo05 {
public static void main(String[] args) {
Thread t1 = new Thread(new RunnableDemo03(),"A");
Thread t2 = new Thread(new RunnableDemo03(),"B");
Thread t3 = new Thread(new RunnableDemo03(),"C");
t1.setPriority(Thread.MIN_PRIORITY);
t2.setPriority(Thread.NORM_PRIORITY);
t3.setPriority(Thread.MAX_PRIORITY);
t1.start();
t2.start();
t3.start();
}
}
8. 同步
例1:同步代码块
class MyThread2 implements Runnable{
private int ticket = 5;
public void run(){
for(int i = 0; i < 10; i++){
synchronized(this){
if(ticket > 0){
try {
Thread.sleep(500);
System.out.println(Thread.currentThread().getName()+":"+ticket--);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}
public class ThreadDemo06 {
public static void main(String[] args) {
MyThread2 m = new MyThread2();
Thread t1 = new Thread(m);
Thread t2 = new Thread(m);
Thread t3 = new Thread(m);
t1.start();
t2.start();
t3.start();
}
}
例2:同步方法
class MyThread2 implements Runnable{
private int ticket = 5;
public void run(){
for(int i = 0; i < 10; i++){
method();
}
}
public synchronized void method(){
if(ticket > 0){
try {
Thread.sleep(500);
System.out.println(Thread.currentThread().getName()+":"+ticket--);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class ThreadDemo06 {
public static void main(String[] args) {
MyThread2 m = new MyThread2();
Thread t1 = new Thread(m);
Thread t2 = new Thread(m);
Thread t3 = new Thread(m);
t1.start();
t2.start();
t3.start();
}
}
9. 线程的生命周期

Java学习随笔5:Java多线程编程的更多相关文章
- (。・・)ノ~个人java学习随笔记录
基本认识 1.编程思维 根据这几天的java学习,编写程序最重要的就是要有一个清晰的思路.语法上的错误可以跟随着不断的联系与学习来弥补,清晰的思维却只有自己来前期模仿,后面慢慢摸索形成一套属于自己的思 ...
- Java学习随笔4:Java的IO操作
1. IO流的作用是读写设备上的数据,如硬盘文件.内存.键盘.网络等.根据数据走向,可分为:输入流和输出流:根据处理的数据类型,可分为:字节流和字符流.字节流可以处理所有类型的数据,如MP3.图片.视 ...
- Java学习笔记53(网络编程:TCP协议案例)
简易的案例 客户端: package demo; import java.io.IOException; import java.io.InputStream; import java.io.Outp ...
- Java学习随笔3:遍历文件夹及文件的读取和写入
import java.io.File; /** * 遍历文件夹 */ public class ScannerFile { public static void main(String[] args ...
- Java学习随笔——RMI
RMI(Remote Method Invocation)远程方法注入,用来实现远程方法调用,是实现分布式技术的一种方法.RMI提供了客户辅助对象和服务辅助对象,为客户辅助对象创建了和服务对象相同的方 ...
- Java学习笔记52(网络编程:UDP协议案例)
InetAddress类: 表示互联网中的IP地址,示例: package demo; import java.net.InetAddress; import java.net.UnknownHost ...
- java学习之浅谈多线程4--SwingWorker
GUI事件处理和绘图代码在一个被称为事件分发线程的特殊线程中执行.如果一个事件需要很长的时间处理,线程就不能顾及到队列中的其他任务.为了解决这个问题,可以运行费时的任务来处理单独线程中的事件.Swin ...
- java学习之浅谈多线程3--线程间协作
通过保证临界区上多个线程的相互排斥,线程同步完全可以避免竞争状态的发生,但是有时还需要线程之间的协作.有两种方式可用于线程间的通信. 1.使用条件Condition Condition接口: +awa ...
- Java学习随笔---常用API(二)
Object类的toString方法 将一个对象返回为字符串形式,但一般使用的时候会覆盖重写toString方法 Object类是所有类的父亲 // public class Person { pri ...
- Java学习之路 -- Java怎么学?
@ 目录 java基础怎么学? 学完基础学什么? 几个常用框架学完学什么? MQ JVM的知识跑不掉 微服务等等 其他 数据结构和算法 java基础怎么学? 当时,作为懵懂的小白,大一学习了c和c++ ...
随机推荐
- linux (RHEL) 添加和删除用户
linux添加新用户使用 useradd -----create a new user or update default new user information 删除用户使用userdel -- ...
- ACM/ICPC 之 DFS范例(ZOJ2412-ZOJ1008)
通过几道例题简单阐述一下DFS的相关题型 ZOJ2412-Farm Irrigation 直观的DFS题型,稍加变化,记录好四个方向上的通路就能够做出来 题目和接水管类似,问最少要灌溉几次,即求解最少 ...
- Apache OFBiz 研究记录01
作为Apache 的顶级项目: Apache OFBiz,功能十分强大,一般开发者很难用到全部功能. 这次笔者的研究主要集中在电子商务平台这一块,一步一步解构. OFBiz下载地址:http://of ...
- 使用iScroll时,input等不能输入内容的解决方法
做移动平台的应用,使用iscroll使屏幕上下滑动.发现当使用iscroll后,input等不能输入内容了.只要在iscroll.js文件中加入如下代码就ok了. function allowForm ...
- 无限轮播的N+2 策略
N张照片把contentsSize设置为N+2个图片的宽度,例子如下,两端填充如图,当处于一端时,且即将进入循环状态的时候,如第二张图,从状态1滑动到状态2,在滑动结束的时候,将当前的位置直接转到状态 ...
- ssh自动登陆
突然碰到有人问ssh再传输密钥时候能不手动输入密码,由于没有碰到过这种情况,所以查了一下发现可以用sshpass做到. sshpass [参数] ssh命令: 参数: -p password #将参 ...
- java实现批量上传(swfupload)
下载 swfupload 文件夹 里面包含handlers.js,swfupload.js,swfupload.swf 三个文件. 我的是和ssh项目整合在一起的.因为struts2的拦截器会拦截所有 ...
- 在没装VS2010的机器上运行VS2010开发的C++程序
在VS2010下写了一个win32控制台应用程序,编译ok.exe,需要依赖osg相关动态库 第一次编译的是Debug版本的,直接将ok.exe和osg相关dll文件拷贝到没有安装VS2010机器上运 ...
- supersr--九宫格公式(根据多少行多少列排版)
- (void)layoutSubviews{ [super layoutSubviews]; NSUInteger count = self.subviews.count; NSInteger ma ...
- 在springMVC的controller层获取view层的参数的方式
方法一:request.getParameter("name") 方法二:注解@RequestParam @RequestMapping("testRequestPara ...