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,线程安全.死锁和生产者--消费者 ...
随机推荐
- linux下kill某个应用
linux命令行与桌面切换快捷键Ctr+Alt+F1,Ctr+Alt+F7 ps -e | grep abc sudo kill xyz
- SVG动画基础篇
参考资料: http://www.w3school.com.cn/svg/index.asp https://msdn.microsoft.com/zh-cn/library/gg193979 gi ...
- Css实现一个菜单导航
提要:使用大div定位设置为relative,子div设置为absolute实现菜单下拉 实现代码: <!DOCTYPE html> <html lang="en" ...
- Android自定义控件之基本原理(一)
前言: 在日常的Android开发中会经常和控件打交道,有时Android提供的控件未必能满足业务的需求,这个时候就需要我们实现自定义一些控件,今天先大致了解一下自定义控件的要求和实现的基本原理. 自 ...
- win10安装 迅雷
下载安装文件所在目录 ,右键,选择以管理员身份运行,输入程序地址,如D:\download\ThunderMini_dl1.5.3.288.exe,回车,这样就出来了程序安装页面,之后就可以就行正常的 ...
- 【Unity3D自学记录】Unity3D之自制小钟表
今天来写一个小钟表,事实上非常easy,就运用到了欧拉角. 首先创建时钟.分钟.秒钟以及4个点(12点.3点.6点.9点)偷懒了~~没弄那么多点. 时钟.分钟.秒钟这三个父级的中心一定要注意,我们旋转 ...
- 关于Adapter对数据库的查询、删除操作
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMzIxMDYyMA==/font/5a6L5L2T/fontsize/400/fill/I0JBQk ...
- Android手机需要安装任务管理软件吗?
使用android手机的用户可能都安装了任务管理的软件,使用android手机真的有必要安装结束任务的软件吗?大家在使用中也都发现了,很多软件在被结束后,马上就会又出现在任务列表里,或是稍等一会自己也 ...
- 【转载】ASP.NET应用程序与页面生命周期
在本文中,我们将了解不同的事件,ASP.NET 应用程序的生命周期以浏览器向 Web 服务器(对于 ASP.NET 应用程序,通常为 IIS)发送请求为起点,直至将请求结果返回至浏览器结束.在这个过程 ...
- hdu3251 最小割
题意: 给n个城市,m条有向边.每条边有权值,如今有些城市能够选择得到.可选的城市有一个价值.可是要满足从1到达不了这些城市,为了满足要求能够去掉一些边,须要花费边的权值,问终于得到的最大价值是多少, ...