JAVA中CyclLink怎么用_Java多线程基本使用一

1      多线程--初步

1进程

比如:QQ、迅雷、360、飞秋...

2线程的概念

3线程的意义:

4.Java程序的运行原理

代码是运行在线程中的,如果一个进程没有线程,那么进程就结束了,也就是说一个进程至少要有一个线程

当开启一个Java程序之后,在进程中至少会自动创建两个线程:主线程、垃圾回收线程

实际上,使用多线程并不是为了提高程序运行的速度,而是为了提高CPU的使用率

多线程:在进程中同时执行着多个执行路径,并且多个线程(执行路径)之间互不干扰

使用场景:

迅雷下载、360多个任务的执行、QQ视屏和文件传输………

for(int i=10;i<=100;i+=10){

System.out.println("洗衣服,进度"+i+"%");

Thread.sleep(500);

}

for(int i=0;i<=100;i+=10){

System.out.println("做饭,进度"+i+"%");

Thread.sleep(500);

}

//创建

WashThread wash = newWashThread();

CookThread cook = newCookThread();

//启动

wash.start();

cook.start();

for(inti=10;i<=100;i+=10){

System.out.println("微波炉加热,进度"+i+"%");

try {

Thread.sleep(500);

} catch(InterruptedException e) {

// TODOAuto-generated catch block

e.printStackTrace();

}

}

//每隔10秒打印Hello,同时可以接受用户输入,并打印出来

Scanner s = newScanner(System.in);

PrintThread t = newPrintThread();

t.start();

while(true){

String line =s.nextLine();

System.out.println(line);

}

//选择性学习

LagRunnable r = newLagRunnable();

ExecutorService service =Executors.newCachedThreadPool();

service.execute(r);

service.execute(r);

service.execute(r);

service.shutdown();

//**************************************

FileReader fr = newFileReader("g:/config.txt");

BufferedReader br = newBufferedReader(fr);

//               ReverseRunnable r =newReverseRunnable();

String name = br.readLine();

Class clz =Class.forName(name);

Runnable r=(Runnable)clz.newInstance();

//**************************************

//以上部分选择性学习,扩展内容

Thread t = new Thread(r);

t.start();

进程运行起来的程序

线程可以理解为一个子进程

进程间进行切换的代价较大,不能共享资源

线程间切换代价小,可以共享数据和逻辑

Java进程每运行一个java应用程序,就会启动一个虚拟机进程,我们的程序就在其中运行

Java线程每个java进程中都默认有一个主线程,名字为main

(我们之前的程序都是在主线程中执行)

Thread类java中的线程,在一个线程中的代码逻辑就像被一根线串起来一样,从前往后顺序执行的

,节省时间、避免程序阻塞带来的问题

分时复用多个线程不停地快速切换使用CPU,表面上看是同时执行,其实也是有先后顺序的,同一时间只有一个线程占有CPU。

创建-->就绪-->运行-->结束

运行-->阻塞--〉就绪

假如当前计算机只有一个CPU且只有一个核心,那么CPU在某一个时刻只能执行一条指令,线程只有得到CPU时间片,也就是使用权,才可以执行指令,那么Java是如何对线程进行调用的呢?

抢占调度模型:优先让优先级高的线程使用CPU,如果线程的优先级相同,那么会随机选择一个,优先级高的线程获取CPU时间片相对多一些

Java使用的是抢占式调度模型

优先级:获取CPU资源的几率

优先级越高的线程会获取越多的运行机会

优先级的取值范围是1-10之间的整数

Java将差别最大的三个优先级定义成了Thread类中的静态常量

MAX_PRIORITY:最高优先级(10)

MIN_PRIORITY:最低优先级(1)

NORM_PRIORITY:默认优先级(5)

可以通过setPriority()和getPriority()方法进行设置和获取

线程的创建和使用

在Java中一切皆对象,线程这一类事物也用了一个类来进行了描述,这个类叫做Thread类

线程的创建

1、继承Thread类

2、实现Runnable接口

1、 通过继承Thread类会出现单继承的问题,通过实现Runnable接口可以避免单继承的不足

2、 通过实现Runnable接口可以将线程的任务从线程的子类中分离出来,进行单独的封装,按照面向对象的思想将任务封装成了对象,并且可以方便实现多个线程的数据共享

1、定义一个类继承Thread,重写父类的run()方法,在run()中写上要在子线程中执行的逻辑

2、创建定义好的类,生成一个实例

3、调用这个实例的start(),启动线程(不要调用run(),这个run()是一个回调方法)

1、定义一个类实现Runnable接口,实现抽象方法run(),在run()中写上要在子线程中执行的逻辑

2、创建一个Thread实例,从构造方法参数传入1中定义类的实例

3、调用start()

Runnable方式从设计上耦合度更低,更灵活

@Override

public void run() {

int progress = 0;  //初始化为0

while(true){

System.out.println(Thread.currentThread().getName()

+"烧饭,进度"+progress+"%");

if(progress ==100){//进度到100停止循环

break;

}

try {

Thread.sleep(100);

} catch(InterruptedException e) {

// TODOAuto-generated catch block

e.printStackTrace();

}

progress++;   //每次进度+1

}

}

Threadt1 = new Thread(new CookRunnable());

t1.start();

Thread t2 = new Thread(newCookRunnable());

t2.start();

CookRunnabler=newCookRunnable();

Threadt1=newThread(r);//两个线程使用同一个Runnable对象

Threadt2=newThread(r);

//以下方式不能共享,因为是分别使用了两个Runnable对象的两个progress属性

/* Thread t1 = new Thread(newCookRunnable());

Thread t2 = new Thread(newCookRunnable());*/

t1.start();//启动

try{

Thread.sleep(50);//错开50毫秒

}catch(InterruptedExceptione) {

//TODOAuto-generated catch block

e.printStackTrace();

}

t2.start();//启动另一个线程

}

1、局部变量不能被多个线程共享

2、成员变量可以被线程共享

Thread t = new Thread(new Runnable() {

@Override

publicvoid run() {

System.out.println("开始睡眠");

try{

Thread.sleep(20000);//睡眠20秒

}catch (InterruptedException e) {

//TODO Auto-generated catch block

System.out.println("睡到一半被断了");

}

System.out.println("结束睡眠");

}

});

t.start();

try{

Thread.sleep(5000);

}catch (InterruptedException e) {

//TODO Auto-generated catch block

e.printStackTrace();

}

t.interrupt();//启动子线程5秒后打断它的睡眠

}

线程的优先级:

t2.setPriority(10);

t1.start();

t2.start();

Stop方法让线程停下:

public class CycleRunnable implements Runnable{

privateboolean control = true;

publicvoid setControl(boolean control) {

this.control= control;

}

@Override

publicvoid run() {

while(control){

try{

Thread.sleep(3000);

}catch (InterruptedException e) {

//TODO Auto-generated catch block

e.printStackTrace();

}

}

}

}

publicstatic void main(String[] args) {

CycleRunnabler =new CycleRunnable();

Threadt = new Thread(r);

t.setName("停不下来的线程");//设置线程名字

t.start();

Scanners = new Scanner(System.in);

while(true){

Stringline = s.nextLine();

System.out.println("line="+line);

if(line.equals("stop")){

r.setControl(false);

break;

}

}

}

礼让Yield():

Thread t2 = new Thread(new Runnable() {

@Override

publicvoid run() {

for(inti=1;i<=1000;i++){

System.out.println("      "+i);

Thread.yield();//让给别的线程使用CPU

//让当前正在执行的线程释放CPU资源,让其他线程有机会去抢占CPU资源

//有可能在释放CPU资源之后,立马自己又再抢到了CPU资源

}

}

});

Thread.currentThread()通过Thread的静态方法获得当前线程的对象,还可以调用这个对象的getName()方法获取其名字

Thread.sleep(longm)通过这个静态方法,可以睡眠m毫秒,当前线程睡眠

setName(Stringn)设置线程名

intgetPriority()获取优先级,数字越大优先级越高,优先级高则抢占CPU成功的概率高一些,优先级范围1-10,默认5

setPriority(intp)设置优先级

yield()让出CPU使用权,但可以马上再抢回来

interrupt()方法,能打断一个线程sleep()、wait()、join()等方法,能让这些方法抛出InterruptedException

join()会合,等待子线程直到它结束,加入当前正在运行的线程,等待加入的线程执行完,再继续执行被加入的线程

setDaemon(boolean)方法将指定的线程设置为后台线程,设置守护线程,所有前台线程都结束后,后台线程(守护线程)会自动结束,该方法要在start()方法之前调用

线程加入:

public class ThreadJoinDemo{

public static void main(String[] args) throwsInterruptedException {

//线程加入

ThreadJoin t1 = new ThreadJoin("线程A");

ThreadJoin t2 = new ThreadJoin("线程B");

ThreadJoin t3 = new ThreadJoin("线程C");

t1.start();

/**

* 加入线程,让指定的线程(t1)加入到当前正在运行的线程(主线程)中

* 并且保证指定的线程执行完之后,在继续执行当前线程

*/

t2.start();

t1.join();

t3.start();

}

}

class ThreadJoin extends Thread{

public ThreadJoin(String name){

super(name);

}

public void run(){

for(int i=0;i<10;i++){

try {

Thread.sleep(500);

System.out.println(Thread.currentThread().getName()+"......."+i);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

}

守护线程(后台线程):

public classThreadDaemonDemo {

public static void main(String[] args) throwsInterruptedException {

// 设置守护线程

ThreadDaemon t1 = new ThreadDaemon("线程A");

ThreadDaemon t2 = new ThreadDaemon("线程B");

ThreadDaemon t3 = new ThreadDaemon("线程C");

t1.start();

Thread.sleep(5000);

/*

* 设置守护线程(后台线程)

* 开启的线程默认都是前台线程,可以通过setDaemon(boolean)方法将指定线程设置为后台线程,

* 当所有前台线程都结束之后,后台线程会自动结束(无论有没有执行完)

*

* 现在,t1和主线程是前台线程,而t2和t3被设置为后台线程,也就是说当t1和主线程都结束之后,

* 也就代表前台线程全部结束了,那么两个后台线程(t2和t3)会自动结束

*/

t2.setDaemon(true);

t3.setDaemon(true);

t2.start();

t3.start();

}

}

class ThreadDaemon extendsThread {

public ThreadDaemon(String name) {

super(name);

}

@Override

public void run() {

for (int i = 1; i <= 20; i++) {

try {

Thread.sleep(500);

System.out.println(getName() +"..." +i);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

}

线程停止:

public class ThreadStop {

public static void main(String[] args) throwsInterruptedException {

Stops t1 = new Stops("线程A");

t1.start();

// 3秒之后停止子线程运行

Thread.sleep(3000);

// 1)使用stop方法

// t1.stop();

// 2)设置标记

// 停止线程最本质的原理其实就是让run()方法执行完

// t1.setFlag(false);

// 3)使用interrupt方法

t1.interrupt();

// System.out.println("结束线程");

}

}

class Stops extends Thread{

private boolean runFlag = true;

public Stops(String name){

super(name);

}

@Override

public void run() {

// while(flag) {

while(!isInterrupted()) { // 判断中断标记是否为true

System.out.println("子线程...");

try {

/*

* 阻塞状态会被中断标记终止,如果是被强制终止阻塞状态的话会抛出中断异常(InterruptedException)

* 并且在结束阻塞状态之后,会清除中断标记(也就是说isInterrupted()返回值为false)

*/

Thread.sleep(6000);

} catch (InterruptedException e) {

//打印异常信息

// e.printStackTrace();

break;

}

}

System.out.println("线程已经运行完毕...");

}

public  voidsetFlag(boolean flag){

this.runFlag = flag;

}

}

1.stop()方法,不建议使用,要让线程结束,就让它执行完;可以使用一个条件变量作为线程中循环条件,然后在外界通过控制这个变量,来使得线程结束(终止线程,已被废弃,不推荐使用)

2、设置标记

3.interrupt():中断线程的阻塞状态,调用该方法之后,线程会标记一个中断标记,当线程处于阻塞(比如休眠) 状态时,如果线程具备中断状态,就会直接中断当前的阻塞状态,并去除中断标记

(isInterrupted():测试线程是否已经中断)

PS:停止线程最本质的原理其实就是让run()方法执行完

生命周期:生命周期:从创建到结束的整个过程,在这期间会包含很多阶段(状态)

新建状态(New):MyThread  t1 = new MyThread();

就绪状态(Runnable):调用start()方法,使线程具有了运行资格,但是没有CPU的执行权(就绪队列:CPU在分配执行权的时候是在就绪队列中随机和挑选一个线程并分配其执行权(CPU调度)),等待CPU调度

运行状态(Running):获取了CPU的执行权,只有在运行状态下的线程才具备CPU的执行权

阻塞状态(Blocked):在运行状态下调用了sleep、wait或其他的一切方法使线程进入阻塞状态(睡眠池、等待池)

【sleep(毫秒值)《睡眠池:一块内存池,集合对象或数组》   wait()《等待池》】

《睡眠结束(时间结束或被中断)被唤醒(notify) -à>>>会再次进入就绪状态》

死亡状态(Dead):stop()    run()执行完《线程一旦结束进入死亡之后,就没有用了,该状态是不可逆的》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/397004.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

指针分析

int *a; int b 4; a &b; //a:b的地址 //*a 取b地址的值&#xff0c;为4 //&a为指针变量的地址 //*(&a)为指针变量储存的地址 即为a int **b &a; //b为指针变量a的地址 //*b为指针变量a所储存的地址 //改变*b(指针变量所储存的地址)即改变了*b的值转载于:http…

live server插件怎么用_分享几个我日常使用的VS Code插件

在这篇文章中&#xff0c;我想介绍一下自己日常使用中最喜欢的Visual Studio Code扩展。大多数时候&#xff0c;我用VS Code编写的是JavaScript应用程序(标准JavaScript、React、Angular、NodeJS……各式各样)。Bracket Pair Colorizer 2这个扩展很不错&#xff0c;可以帮助我搞…

Xtrabackup数据全备份与快速搭建从服务器

Percona Xtrabackup可以说是一个完美的数据备份工具。特别是当数据库的容量达到了一定数量级的时候且存在单表达到几十G的数据量&#xff0c; 很难容忍一些逻辑备份的漫长时间。如单个数据库约200G&#xff0c;单表最大为120G&#xff0c;mysqldump逻辑备份的时间长达20多小时。…

简单的java方法_Java简单实用方法一

整理以前的笔记&#xff0c;在学习Java时候,经常会用到一些方法。虽然简单但是经常使用。因此做成笔记&#xff0c;方便以后查阅这篇博文先说明构造和使用这些方法。1&#xff0c;判断String类型数据是否为空String类型的数据为空&#xff0c;主要为等于null或”“那么只要判断…

Android应用程序开发

第一章 Android应用初体验 1.1应用基础 activity是Android SDK中Activity类的一个具体实例&#xff0c;负责管理用户与信息屏的交互。 应用的功能是通过编写一个个Activity子类来实现的。 布局定义了一系列用户界面对象以及它们显示在屏幕上的位置。组成布局的定义保存在XML文件…

phonegap

phonegap 框架详解 转自&#xff1a;http://www.cnblogs.com/hubcarl/p/4216844.html首先, 来看一下phonegap 初始化流程以及Native 与 JS 交互流程图。 说明&#xff1a;socket server模式下, phonegap.js 源码实现的采用1 毫秒执行一次XHR请求, 当Native JS 队列里面有JS语…

j2ee核心模式_Operator和Sidecar正在成为软件交付新模式

现如今的开发人员希望可以开发出具备弹性和可扩展的分布式系统。该系统受益于软件复用和开源模型创新&#xff0c;针对安全性问题能够轻易完成补丁更新并进行低风险的升级。该系统不可能通过带有各种嵌入式语言库的应用程序框架来实现。最近&#xff0c;一篇关于“多运行时微服…

微信JS-SDK选择相册或拍照并上传PHP实现

理解&#xff1a;微信上传接口是拍照&#xff0c;或者选择本地照片&#xff0c;上传到微信的服务器&#xff0c;获取到一个id&#xff0c;通过token与这个id获取到图片&#xff0c;保存到服务器即可。 效果 通过微信js接口&#xff0c;调用底层程序。 需要引入js文件&#xff0…

JMS-ActiveMQ学习-3 ActiveMQ与Spring集成

Spring下开发消息的发送和接收程序 点对点模式 一、创建生产者项目 1.创建maven项目 2.添加spring-jms、jms规范、activemq依赖 <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jms&…

看libevent所遇到的英语生词

libevent – an event notification library The libevent API &#xff08;libevent应用程序&#xff09;provides a mechanism&#xff08;机制&#xff09; to execute&#xff08;执行&#xff09; a callback function&#xff08;回调函数&#xff09; when a specific&a…

java中迭代器要导包吗_java 中迭代器的使用方法详解

java 中迭代器的使用方法详解前言&#xff1a;迭代器模式将一个集合给封装起来&#xff0c;主要是为用户提供了一种遍历其内部元素的方式。迭代器模式有两个优点&#xff1a;①提供给用户一个遍历的方式&#xff0c;而没有暴露其内部实现细节&#xff1b;②把元素之间游走的责任…

android socket 长连接_TCP/IP,http,socket,长连接,短连接

点击上方蓝色字体&#xff0c;选择“标星公众号”优质文章&#xff0c;第一时间送达上一篇&#xff1a;这300G的Java资料是我师傅当年给我的&#xff0c;免费分享给大家下一篇&#xff1a;这200G的Java实战资料是我师傅当年教我的第二招作者 | ksfzhaohui来源 | my.oschina.net…

二、Python安装扩展库

第一步:推荐easy_install工具 下载地址:https://pypi.python.org/pypi/setuptools 下载"ez_setup.py"文件; 通过运行cmd命令找到ez_setup.py文件所在目录,通过命令[python ez_setup.py]执行安装easy_install 安装成功截图 第二步:安装扩展酷 例如安装"suds"…

ORACLE 10.2.01升级10.2.05 for windows 详细文档

最近要做一个数据库的升级工作&#xff0c;提前在自己的PC机上练习了一下&#xff0c;这种文档在网上很多&#xff0c;但是大多都是使用命令编辑脚本&#xff0c;其实数据库还有一个DBUA的升级工具可以使用&#xff0c;使升级工作方便了很多。 OS环境&#xff1a;windows XP 32…

php 导出mysql 结构_导出结构和数据(如phpmyadmin)

在这里,您可以找到一个全面的解决方案来转储MySQL结构和数据,比如在PMA中(不使用exec、passthru等):它是Dszymczuk项目的一个分支,有我的增强功能。用法很简单//MySQL connection parameters$dbhost localhost;$dbuser dbuser;$dbpsw pass;$dbname dbname;//Connects to my…

tableViewCell的操作

在iOS的开发过程中&#xff0c;tableView的使用永远都是最常用的控件。今天学习了一下tableViewCell的操作。代码并不是很复杂&#xff0c;如果有OC开发经验的人&#xff0c;应该很容易看懂的。 class ViewController: UIViewController ,UITableViewDelegate, UITableViewData…

stm32正交编码器 原理图_恶劣环境下应用的电感式增量编码器和绝对编码器

编码器可分为两种基本类型 - 增量编码器和绝对编码器。增量编码器的显着特征是它报告角度的变化。换句话说&#xff0c;当增量编码器通电时&#xff0c;它不会报告其角位置&#xff0c;直到它具有测量的参考点。绝对编码器明确地在比例或范围内报告其位置。换句话说&#xff0c…

【SqlServer】Sqlserver中的DOS命令操作

输入osql ?查看是否支持当前版本&#xff0c;如果是SQL Server 2005以上用Sqlcmd , 以下用Osql连接数据库&#xff08;a&#xff09;Osql -S localhost -U username -P password(SQL Server身份验证&#xff0c;需要用户民和密码)&#xff08;b&#xff09;Osql -S localhos…

微信小程序内训笔记

2016年9月22日凌晨微信官方正式宣布“小程序”开始内测&#xff0c;有“微信之父”之称、腾讯集团高级执行副总裁张小龙在2016年末对外宣布“小程序“应用将于2017年1月9日正式推出 这一次微信还是按照惯例&#xff0c;通过机器跑出的数据&#xff0c;首先将“小程序”开放给了…

python基础代码的含义_Python基础学习篇

原标题&#xff1a;Python基础学习篇 1、编码 默认情况下&#xff0c;Python 3 源码文件以 UTF-8 编码&#xff0c;所有字符串都是unicode 字符串。 当然你也可以为源码文件指定不同的编码&#xff1a;# -*- coding: cp-1252 -*- 2、标识符 第一个字符必须是字母表中字母或下划…