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,线程安全.死锁和生产者--消费者 ...
随机推荐
- 洛谷—— P2251 质量检测
https://www.luogu.org/problemnew/show/P2251 题目背景 无 题目描述 为了检测生产流水线上总共N件产品的质量,我们首先给每一件产品打一个分数A表示其品质,然后 ...
- codevs——2956 排队问题
2956 排队问题 时间限制: 1 s 空间限制: 32000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 有N个学生去食堂,可教官规定:必须2人或3 ...
- 仓鼠找sugar(lca)
洛谷——P3398 仓鼠找sugar 题目描述 小仓鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每个节点的编号为1~n.地下洞穴是一个树形结构.这一天小仓鼠打算从从他的卧室(a)到餐厅( ...
- 分享Kali Linux 2017年第11周镜像文件
分享Kali Linux 2017年第11周镜像文件 Kali?Linux官方于3月12日发布2017年的第11周镜像.这次维持了11个镜像文件的规模.默认的Gnome桌面的4个镜像,E17.KDE ...
- springboot使用Mybatis(xml和注解)全解析
刚毕业的第一份工作是 java 开发,项目中需要用到 mybatis,特此记录学习过程,这只是一个简单 demo,mybatis 用法很多不可能全部写出来,有更复杂的需求建议查看 mybatis ...
- Spring IOC知识java反射
[1] Java反射知识-->Spring IoC :http://www.iteye.com/topic/1123081 [2] Java动态代理-->Spring AOP :http: ...
- hadoop安全之hftp
hftp默认是打开的,同意以浏览器的方式訪问和下载文件,以此方式下,能够读取全部文件,留下了安全隐患. 測试例如以下 /user/hive/warehouse/cdntest.db/selfreado ...
- pycharm5.0 激活方式
Pycharm5注册方式 0x1 ,安装 0x2 , 调整时间到2038年. 0x3 ,申请30天试用 0x4, 退出pycharm 0x5, 时间调整回来. ##注册方法2### 注册方法: ...
- bash 的环境配置文件
http://www.cnblogs.com/ggjucheng/archive/2012/11/01/2750179.html bash 的环境配置文件 你是否会觉得奇怪,怎么我们什么动作都没有进行 ...
- Spring的常见问题及答案
目录 Spring 概述 依赖注入 Spring beans Spring注解 Spring数据访问 Spring面向切面编程(AOP) Spring MVC Spring 概述 1. 什么是spri ...