java学习之线程的操作方法
package com.gh.thread; /**
* 线程实现的两种方法
* 1、继承thread类
* 2、实现Runnable接口
* @author ganhang
*
*/
public class ThreadDemo { public static void main(String[] args) {
//第一种线程实现
Mythread mythread =new Mythread();
mythread.setName("自定义线程1");
mythread.start();
try {
Thread.sleep(2);//当前线程睡眠2毫秒
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName());
//第二种线程实现
Thread thread=new Thread(new Mythread2(),"自定义线程2");
thread.start();
}
} class Mythread extends Thread{
@Override
public void run() {
for (int i = 0; i < 3; i++) {
//输出当前线程的名字和i;
System.out.println(Thread.currentThread().getName()+"--"+i);
}
}
}
class Mythread2 implements Runnable{ @Override
public void run() {
for (int i = 0; i <3; i++) {
System.out.println(Thread.currentThread().getName()+"--"+i);
}
} }
线程的同步
package com.gh.thread;
/**
* 同步实现顺序上厕所,假设厕所只有一个
* 1、使用synchronized同步代码块
* 2、使用同步方法
* @author ganhang
*/
public class ThreadDemo1 {
public static void main(String[] args) {
Mythread5 my=new Mythread5();
//注意这里必须使用同一个Mythread类的对象,不然无法同步
Thread t1=new Thread(my,"小白");//线程1
Thread t2=new Thread(my,"小黑");//线程2
//两个线程同时跑
t1.start();//小白要上厕所
t2.start();//小黑也要上厕所
}
}
class Mythread5 implements Runnable{
@Override
public void run() {
//同步代码块
synchronized (this) {//锁定对象一次只能进一个个
System.out.println(Thread.currentThread().getName()+"正在上厕所。。");
try {
Thread.sleep(1000);//模拟**。。。耗时1s
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"上完了。。");
}
}
}
中断线程
package com.gh.thread; /**
* 中断线程
* 1、interrupt()方法
* 2、自定义标记完成中断
* @author ganhang
*
*/
public class ThreadDemo2 {
public static void demo1() {
Thread t1 = new Thread(new Mythread3(), "线程1");
t1.start();
for (int i = 0; i < 10; i++) {
if (i == 5)
t1.interrupt();//只是个标记中断不会真正中断,是否中断还是由线程自己决定
System.out.println("main-" + i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void demo2(){
Mythread4 my=new Mythread4();
Thread t1=new Thread(my,"线程2");
t1.start();
for(int i=0;i<10;i++){
if(i==5){
my.setFlag(true);//中断
}
System.out.println(Thread.currentThread().getName()+"--"+i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
demo1();//第一种方式实现
demo2();//第二种方式实现
}
} class Mythread4 implements Runnable {
private boolean flag = false; public boolean isFlag() {
return flag;
} public void setFlag(boolean flag) {
this.flag = flag;
} @Override
public void run() {
int i=0;
while (!flag) {
System.out.println(Thread.currentThread().getName() + "--" + i++);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
} }
}
} class Mythread3 implements Runnable { public void run() {
int i = 0;
while (!Thread.interrupted()) {
System.out.println(Thread.currentThread().getName() + "--" + i++);
try {
Thread.sleep(1000);// sleep会清除interrupt状态
} catch (InterruptedException e) {
e.printStackTrace();
Thread.currentThread().interrupt();
}
}
}
}
java学习之线程的操作方法的更多相关文章
- Java学习笔记 线程池使用及详解
有点笨,参考了好几篇大佬们写的文章才整理出来的笔记.... 字面意思上解释,线程池就是装有线程的池,我们可以把要执行的多线程交给线程池来处理,和连接池的概念一样,通过维护一定数量的线程池来达到多个线程 ...
- 进阶Java编程(2)线程常用操作方法
线程常用操作方法 多线程的主要操作方法都在Thread类中定义的. 1,线程的命名和取得 多线程的运行状态是不确定的,那么在程序的开发之中为了可以获取到一些需要使用到的线程就只能依靠线程的名字来进行操 ...
- java学习之- 线程运行状态
标签(空格分隔): 线程运行状态 线程的运行状态: 如下是是我编写的一个图,大家可以作为参考: 1.new一个thread子类也是创建了一个线程: 2.创建完毕之后start()-----运行, 3. ...
- java学习之线程
一.线程总述: 线程是java当中一个重要的内容,如果想说线程的话,那我们应该先来讲一下什么是进程. 进程:那么什么是进程呢,进程从字面上来理解就是,正在进行的程序.就比如说我们在windows当中打 ...
- java学习之线程池的实现
package com.gh.threadpoor; import java.util.concurrent.ExecutorService; import java.util.concurrent. ...
- Java 学习笔记 线程控制
题目一 本质上来说,线程是不可控制的,线程的执行是由CPU资源分配决定的,我们无法干预系统CPU的资源分配,但我们可以增加条件来让线程按照我们的预想顺序来执行. 比如.如果当前的执行的线程不满足我们所 ...
- java学习之- 线程继承Thread类
标签(空格分隔): 线程 在java.lang包中有个Thread子类,大家可以自行查阅文档,及范例: 如何在自定义的代码中,自定义一个线程呢? 1.通过对api的查找,java已经提供了对线程这类事 ...
- Java学习:线程池
线程池 线程池概念:其实就是一个容纳多个线程的容器,其中的线程可以反复使用,省去了频繁创建线程对象的操作,无需反复创建线程而消耗过多的资源. 线程池:容器-->集合(ArrayList,Hash ...
- Java学习:线程的安全问题
线程的安全问题 模拟卖票案例创建三个的线程,同时开启,对共享的票进行出售 public class RunnableImpl implementsc Runnable{ //定义一个多线程共享的票源 ...
随机推荐
- popupwindow 模拟新浪、腾讯title弹框效果
.jpg外部引用 原始文档 MainActivity.java外部引用 原始文档 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 ...
- linux进程之fork 和 exec函数
---恢复内容开始--- fork函数 该函数是unix中派生新进程的唯一方法. #include <unistd.h> pid_t fork(void); 返回: (调用它一次, 它 ...
- .net 微信APP支付接口的开发流程以及坑
流程 申请APP的微信支付 申请成功之后得到APPID 商户号 以及自己设置商户号的支付密码 这时就可以开发接口了 微信APP支付API:https://pay.weixin.qq.com/wiki/ ...
- Jquery 方法大全
一.JQuery常用的方法 :(JQuery中90%都是方法,没有参数是获取,带参数是设置) $("#id").css('backgroundColor','blue'); .cs ...
- Visual Studio 继续并运行上次的成功生成,未提示直接运行上一个版本解决方案!
Visual Studio ==>工具 ==> 选项==>项目和解决方案 ==>生成并运行_运行时,当出现生成或部署错误时_选择,提示启动
- VS2012 内容存储区指定的位置无效或者您无权访错误
——解决由于移动过microsoft help viwer( msdn )数据目录,又误删除数据目录后,引发其不能启动问题 1.使用命令行下载microsoft help viwer( msdn )数 ...
- EventStore的设计思路
EventStore的设计思路 最近打算用C#实现一个基于文件的EventStore. 什么是EventStore 关于什么是EventStore,如果还不清楚的朋友可以去了解下CQRS/Event ...
- 泛型 "new的性能"
完美的.net泛型也有特定的性能黑点?追根问底并且改善这个性能问题 完美的.net真泛型真的完美吗 码C#多年,不求甚解觉得泛型就是传说中那么完美,性能也是超级好,不错,在绝大部分场景下泛型表现简直可 ...
- PROTEL99生成GERBER的操作说明
GBL BOTTOM LAYER(底层布线图)GBO BOTTOM OVERLAYER(底层丝印层)GBP BOTTOM PASTE LAYER(底层锡膏层)GBS BOTTOM SOLDER MAS ...
- JetBrains IntelliJ IDEA for Mac 15.0 破解版 – Mac 上强大的 Java 集成开发工具
应网友要求更新. IntelliJ IDEA 是最强大的 Java IDE 之一,由知名的Jetbrainsg公司出品,最新版本增加了大量强大易用的特性,比如 Java 8 的Lambda 表达式调试 ...