java多线程-多线程常识
线程和进程的区别是什么?进程是一个正在运行的软件程序,打开资源管理器可以看到好多正在运行的进程,而线程则是程序中的顺序控制流,只能使用分配给程序的资源和环境。一个进程至少存在一个线程(主线程)。
在java中有两种创建线程的方式:继承Thread类和实现Runnable接口。
线程有以下几种状态,创建状态->就绪状态(start)->运行状态(执行run方法)->阻塞状态(暂时停止执行)->终止状态
1. 先来看下线程的实现:
package com.javaTestDemo;
public class JavaThreadDemo {
public static void main(String[] args) {
//1.继承Thread
// MyThread t1 = new MyThread("A");
// MyThread t2 = new MyThread("B");
//
// t1.start();
// t2.start();
//2.实现runnable接口
MyRunnable r1 = new MyRunnable("A");
MyRunnable r2 = new MyRunnable("B");
Thread t1 = new Thread(r1);
Thread t2 = new Thread(r2);
t1.start();
t2.start();
}
}
/**
* 继承Thread
* @author newtouch
*
*/
class MyThread extends Thread
{
String name;
public MyThread(String name)
{
this.name=name;
}
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
for(int i=0;i<20;i++)
{
System.out.println("线程"+name+i);
}
}
}
/**
* 实现runnable接口
* @author newtouch
*
*/
class MyRunnable implements Runnable
{
String name;
public MyRunnable(String name)
{
this.name=name;
}
@Override
public void run() {
for(int i=0;i<20;i++)
{
System.out.println("线程"+name+i);
}
}
}
可以看到线程输出AB是并发执行的:

2.线程的常用方法
写过自动化测试脚本的同学肯定对这个方法不陌生
Thread.sleep(); 线程休眠
还有哪些常用方法呢?
①取得线程名称 getName()
②取得当前线程对象 currentThread()
③判断线程是否启动 isAlive()
④线程的强行运行 join()
⑤线程礼让 yield()
来看下join()方法和yield()方法:
MyRunnable r1 = new MyRunnable("A");
// MyRunnable r2 = new MyRunnable("B");
Thread t1 = new Thread(r1);
// Thread t2 = new Thread(r2);
//
t1.start();
// t2.start();
//join()方法
for(int i=0;i<30;i++)
{
if(i==5)
{
try {
t1.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("主线程:"+i);
}
当主线程执行到i=5的时候,强行让t1线程执行:

class MyRunnable implements Runnable
{
String name;
public MyRunnable(String name)
{
this.name=name;
}
@Override
public void run() {
for(int i=0;i<50;i++)
{
System.out.println("线程"+name+i);
if(i==10)
{
System.out.println("礼让");
Thread.yield();
}
}
} }
当i=10的时候,线程礼让查看输出:

可以看到当两个线程到10的时候都礼让让另一个线程执行
3.线程的同步
举个例子,好几个窗口一同往外卖票,虽然都是并发执行的,但是票数是一定的是共有的,票数是随着多个窗口往外卖而同步减少的,这样的话我们就需要线程同步。
①同步代码块,在代码块加上 synchronized 关键字,则此代码块就被称为同步代码块
格式:
synchronized(同步对象){
需要同步的代码;
}
②同步方法
synchronized void 方法名称(){}
同步代码块:
package com.javaTestDemo;
public class JavaThreadDemo2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
MyThreadDemo2 mt = new MyThreadDemo2();
Thread t1 = new Thread(mt);
Thread t2 = new Thread(mt);
Thread t3 = new Thread(mt);
t1.start();
t2.start();
t3.start();
}
}
class MyThreadDemo2 implements Runnable
{
private int ticket = 50;
@Override
public void run() {
for(int i=0;i<50;i++)
{
synchronized (this) {
if(ticket>0)
{
System.out.println(Thread.currentThread()+"车票:"+ticket--);
}
}
}
}
}
可以看到输出:

也可以同步方法:
class MyThreadDemo2 implements Runnable
{ private int ticket = 150;
@Override
public void run() {
for(int i=0;i<150;i++)
{
sell();
}
}
public synchronized void sell(){
if(ticket>0)
{
try {
Thread.sleep(500);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread()+"车票:"+ticket--);
} }
}
查看输出:

简单记录下线程的入门学习,以后再深入学习理解关于线程的更多知识。
java多线程-多线程常识的更多相关文章
- Java的多线程机制系列:不得不提的volatile及指令重排序(happen-before)
一.不得不提的volatile volatile是个很老的关键字,几乎伴随着JDK的诞生而诞生,我们都知道这个关键字,但又不太清楚什么时候会使用它:我们在JDK及开源框架中随处可见这个关键字,但并发专 ...
- java之多线程 二
线程的生命周期: 当线程被创建并被启动时,它既不是一启动就进入了执行状态,在线程的生命周期中,它要经过new(新建),就绪(Runnable),运行(Running),阻塞(Blocked),dead ...
- Java的多线程机制系列:(一)总述及基础概念
前言 这一系列多线程的文章,一方面是个人对Java现有的多线程机制的学习和记录,另一方面是希望能给不熟悉Java多线程机制.或有一定基础但理解还不够深的读者一个比较全面的介绍,旨在使读者对Java的多 ...
- Java Thread 多线程 介绍
1.线程概述 几乎所有的操作系统都支持同时运行多个任务,一个任务通常就是一个程序,每个运行中的程序就是一个进程. 当一个程序运行时,内部可能包含了多个顺序执行流,每个顺序执行流就是一个线程. 2.线程 ...
- Java:多线程<一>
程序运行时,其实是CPU在执行程序的进程,为了提高工作效率一个进程可以有多个线程. Java的多线程: 其实我们之前就见过Java的线程,main就是Java的一个线程,还有另一个条线程总是和main ...
- Java的多线程机制系列:(四)不得不提的volatile及指令重排序(happen-before)
一.不得不提的volatile volatile是个很老的关键字,几乎伴随着JDK的诞生而诞生,我们都知道这个关键字,但又不太清楚什么时候会使用它:我们在JDK及开源框架中随处可见这个关键字,但并发专 ...
- Java的多线程机制系列:(三)synchronized的同步原理
synchronized关键字是JDK5之实现锁(包括互斥性和可见性)的唯一途径(volatile关键字能保证可见性,但不能保证互斥性,详细参见后文关于vloatile的详述章节),其在字节码上编译为 ...
- Java基础——多线程
Java中多线程的应用是非常多的,我们在Java中又该如何去创建线程呢? http://www.jianshu.com/p/40d4c7aebd66 一.常用的有三种方法来创建多线程 新建一个类继承自 ...
- JAVA之多线程的创建
转载请注明源出处:http://www.cnblogs.com/lighten/p/5967853.html 1.概念 老调重弹,学习线程的时候总会牵扯到进程的概念,会对二者做一个区分.网上有较多的解 ...
- Java基础--多线程的方方面面
1,什么是线程?线程和进程的区别是什么? 2,什么是多线程?为什么设计多线程? 3,Java种多线程的实现方式是什么?有什么区别? 4,线程的状态控制有哪些方法? 5,线程安全.死锁和生产者--消费者 ...
随机推荐
- luogu P1510 精卫填海
题目描述 [版权说明] 本题为改编题. [问题描述] 发鸠之山,其上多柘木.有鸟焉,其状如乌,文首,白喙,赤足,名曰精卫,其名自詨.是炎帝之少女,名曰女娃.女娃游于东海,溺而不返,故为精卫.常衔西山之 ...
- PhoneGap_百度百科
PhoneGap编辑 PhoneGap是一个用基于HTML,CSS和JavaScript的,创建移动跨平台移动应用程序的 快速开发平台.它使开发者能够利用iPhone,Android,Palm,Sym ...
- linux查看 cpu及内存和硬盘使用情况的命令top
使用时输入 top,退出时输入q http://www.cnblogs.com/ggjucheng/archive/2012/01/08/2316399.html 简介 top命令是Linux下常用的 ...
- DICOM:DICOM万能编辑工具之Sante DICOM Editor
版权声明:本文为zssure原创文章,转载请注明出处,未经允许不得转载. 目录(?)[-] 背景 DICOM Service的配置 Sante DICOM Editor自启动的服务 PACS查询下 ...
- JAVA微信开发:[17]如何获取所有关注用户
该方法获取所有关注公共账号的微信用户的openId集合, 再通过openId集合既可以获取所有的用户的信息. /** * 获取所有的关注用户 * * @return */ public List ...
- intellij idea 提示找不到default activivty
更换环境之后 ,intellij idea 提示找不到默认的activity. 而查看源代码. 在代码中明显已经设置了默认activity了. 后来发现.程序中有个库工程中的AndroidMe ...
- iOS实现提现类似的密码输入框
最近一段时间,在网上不断看了一些技术人员写的代码demo,由于前段时间一直在写一个电商项目,记得有一个功能和看到的demo中类似,但是截然2种不同的处理方法,个人觉得我的这个方法更为简洁一些,所以我把 ...
- cocos2d-x入口类
上一篇文章中有一个在栈中创建的实例--AppDelegate.这个类的初始化使cocos2d-x的程序能够执行起来.由于它是继承于CCApplication类.而执行的run方法就是在此类中实现的. ...
- C语言-回溯例1
回溯法解N皇后问题 1,代码分析: 使用一个一维数组表示皇后的位置 其中数组的下标表示皇后所在的行 数组元素的值表示皇后所在的列 这样设计的棋盘,所有皇后必定不在同一行 假设前n-1行的皇后已经按照规 ...
- C# trim split dataGrid
C#中Trim().TrimStart().TrimEnd()的用法: 这三个方法用于删除字符串头尾出现的某些字符.Trim()删除字符串头部及尾部出现的空格,删除的过程为从外到内,直到碰到一 ...