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,线程安全.死锁和生产者--消费者 ...
随机推荐
- Xcode文件名后的字母含义
Xcode文件名后的字母含义 在Xcode中,左侧的dock区域显示项目结构.很多时候,文件名后方会出现一个字母提示,如M.A之类的.这实际是一种提示符号.如果项目中使用SVN.Git等版本控制工 ...
- Codeforces Round #317 [AimFund Thanks-Round] (Div. 2) Minimization dp
原题链接:http://codeforces.com/contest/572/problem/D 题意 给你个数组A和n,k,问你排列A后,下面的最小值是多少. 题解 先排个序,要填充像1,1+k,1 ...
- Uoj #350. 新年的XOR
前缀异或和是可以讨论的,非常naive,然后这就是个水题了23333 #include<bits/stdc++.h> #define ll long long using namespac ...
- Maven创建Java Application工程(既jar包)
Maven在创建工程时使用的是archetype(原型)插件,而如果要创建具体的工程,比如Application这些,那么可以使用maven-archetype-quickstart(相当于一个子类型 ...
- 【hibernate】唯一约束 注解
唯一约束注解 单列约束和联合约束 分别如下 @Table( uniqueConstraints = { @UniqueConstraint(columnNames = "uid") ...
- 8.【nuxt起步】-vue组件之间数据交互
那么现在问题来了,我现在是在index.vue获取了服务端的数据,怎么传值到maincontent.vue?当然你也可以把获取数据放在maincontent.vue,但假如有些数据同时在header, ...
- oralce中相关的概念整理
[数据库名] 概念:就是一个数据库的标识,作用等同于我们的身份证的作用,假设一台机器上安装了多个数据库,那么每一个数据库都会有一个数据库名称相应,这些数据库名称在数据库被创建的时候,数据库名称也会被 ...
- PHP 实现Word,excel等转换pdf
近期做一个项目,须要将用户上传的word,excel文档转成PDF文档保存并打印.在网上找了非常多资料.并不全面,所以自己写了一份比較全面的教程来分享. 以下是操作步骤: 1. 安装免费 ...
- JSP技术基础(动态网页基础)
前言:如果说html为静态网页基础,那么jsp就是动态网页基础,两者的区别就是jsp在html的前面多加了几行而已.当然,jsp里面对java的支持度更高.要明白,js只是嵌入在客户端的小程序小脚本而 ...
- 【环境配置】Linux的经常使用命令
系统信息 arch 显示机器的处理器架构uname -m 显示机器的处理器架构uname -r 显示正在使用的内核版本号 dmidecode -q 显示硬件系统部件 - (SMBIOS / DMI) ...