Java 线程多线程编程1---基础

1、线程的基本概念


例子:


分析:


2、线程的创建和启动


第一种线程的创建:

    定义一个线程类来实现Runner接口

例子:

package com.zhj.www;
import java.lang.Thread;
public class TestThread1 {public static void main(String[] args) {Runner1 runner1  = new Runner1();Thread myThread  = new Thread(runner1);myThread.start();//这行注释掉的话,线程就不会执行。for(int i=0;i<100;i++) {System.out.println("Main Thread:-----" + i);}}
}
class Runner1 implements Runnable{public void  run() {for(int i = 0;i<100;i++) {System.out.println("Runner1:" + i);}}
}

运行结果:


我们会发现,主线程,和子线程是交替执行的。

但是呢,要注意:

但是若是直接调用run方法,是方法调用,两者之间天壤之别,只有执行完成一个才会去执行另一个。


package com.zhj.www;
import java.lang.Thread;
public class TestThread1 {public static void main(String[] args) {Runner1 runner1  = new Runner1();//Thread myThread  = new Thread(runner1);runner1.run();//myThread.start();//这行注释掉的话,线程就不会执行。for(int i=0;i<100;i++) {System.out.println("Main Thread:-----" + i);}}
}
class Runner1 implements Runnable{public void  run() {for(int i = 0;i<100;i++) {System.out.println("Runner1:" + i);}}
}
证明如下:


第二种线程的创建:

定义一个Thread的子类并重写其run方法。

例子:

package com.zhj.www;
import java.lang.Thread;
public class TestThread1 {public static void main(String[] args) {MyThread myThread  = new MyThread();myThread.start();for(int i=0;i<100;i++) {System.out.println("Main Thread:-----" + i);}}
}
class MyThread extends Thread{public void  run() {for(int i = 0;i<100;i++) {System.out.println("Runner1:" + i);}}
}

此时,已经新建一个MyThread类继承自Thread类,所以就不用new一个Thread 的对象出来了,而只需要new一个MyThread的子对象。然后调用其start()方法。

执行结果:


我们发现和第一种创建线程的结果是一样的,也是交替执行。但是两个线程分得到的时间片并不一定是相同的。

两个方式有什么区别呢?继承Thread类的方式(第二种方式)比较死,只能从一个类继承,第一种方式呢?比较灵活实现接口,还可以从其他类继承。只要能实现接口,就不要从Thread类继承。

线程状态转换:




1、sleep方法:

package com.zhj.www;import java.util.*;public class TestInterrupt {public static void main(String[] args) {MyThread thread = new MyThread();thread.start();try {Thread.sleep(10000);//主线程睡眠}catch (InterruptedException e) {}//thread.interrupt();//睡着的时候打断,太粗暴了//为什么不用它呢?thread.flag = false;}
}class MyThread extends Thread{boolean flag = true;public void run() {while(flag) {System.out.println("==="+new Date()+"===");try {sleep(1000);} catch (InterruptedException e) {return;}}}
}

运行结果:


2、join方法:


栗子:

package com.zhj.www;public class TestJoin {public static void main(String[] args) {MyThread2 t1 = new MyThread2("abcdef");t1.start();try {t1.join();//合共}catch (InterruptedException e) {}for(int i = 1;i<=10;i++) {System.out.println("I am main thread");}}
}
class MyThread2 extends Thread{public MyThread2(String s) {super(s);}public void run() {for(int i = 0; i<=10;i++) {System.out.println("I am "+ getName()+" (i:)"+i);try {sleep(1000);} catch (InterruptedException e) {return;}}}
}

运行结果:



3、yield方法:


package com.zhj.www;import java.util.*;public class TestYield {public static void main(String[] args) {MyThread3 t1 = new MyThread3("t1");MyThread3 t2  = new MyThread3("t2");t1.start();t2.start();}
}class MyThread3 extends Thread{MyThread3(String s) {super(s);}public void run() {for (int i = 1; i <= 100; i++) {System.out.println(getName()+": "+i);if(i%10 == 0) {yield();}}}
}

运行结果:

t1到10的倍数切换t2,t2到10的倍数切换t1;


上例子:

package com.zhj.www;public class TestPriority {public static void main(String[] args) {Thread t1 = new Thread(new T1());Thread t2 = new Thread(new T2());t1.setPriority(Thread.NORM_PRIORITY+3);//t1得到的执行时间长t1.start();t2.start();}
}
class T1 implements Runnable{public void run() {for(int i =0;i< 100;i++) {System.out.println("T1: "+ i);}}
}
class T2 implements Runnable{public void run() {for(int i =0;i< 100;i++) {System.out.println("-------T2: "+ i);}}
}
运行一下:

可以发现:t1比t2运行的时间长。

--------------------------------------------------------------------------------------

--------------------------------------------------------------------------------------

额外的栗子:

--------------------------------------------------------------------------------------

TestThread2.java

package com.zhj.www;public class TestThread2 {public static void main(String[] args) {Runner2 r = new Runner2();Thread t1 = new Thread(r);Thread t2 = new Thread(r);t1.start();t2.start();}
}class Runner2 implements Runnable{public void run() {for(int i = 0; i <= 30; i++) {System.out.println("No: "+ i);}}
}

运行一下:

TestThread3.java

package com.zhj.www;public class TestThread3 {public static void main(String[] args) {Runner3  runner3 = new Runner3();Thread thread = new Thread(runner3);thread.start();}
}
class Runner3 implements Runnable {public void run() {for(int i = 0; i<30;i++) {if(i%10 == 0 && i != 0) {try {Thread.sleep(2000);} catch (InterruptedException e) {}}System.out.println("No. " + i);}}
}

当i 是 10的倍数时,会睡眠2s。

运行结果:

TestThread4.java

package com.zhj.www;public class TestThread4 {public static void main(String[] args) {Runner4 r  = new Runner4();Thread t = new Thread(r);t.start();for(int i = 0; i< 100000 ; i++) {if(i%10000 == 0 & i>0) {System.out.println("in thread main i =" + i);}	}System.out.println("Thread mian is over");r.shutDown();}
}class Runner4 implements Runnable{private boolean flag = true;public void run() {int i = 0;while(flag == true) {System.out.println(" " + i++);}}public void shutDown() {flag = false;}
}

主要:怎么让一个正常执行的线程停止。

run方法结束,线程就结束。

运行结果:


TestThread5.java(关于join方法)

package com.zhj.www;public class TestThread5 {public static void main(String[] args) {Runner5 r = new Runner5();Thread thread = new Thread(r);thread.start();try {thread.join();}catch (InterruptedException e) {}for(int i = 0; i<50;i++) {System.out.println("主线程:"+ i);}}
}
class Runner5 implements Runnable{public void run(){for(int i= 0 ;i<50;i++) {System.out.println("SubThread: " + i);}}
}
运行结果:

TestThread6.java

package com.zhj.www;public class TestThread6 {public static void main(String[] args) {Thread thread = new Runner6();thread.start();for(int i = 0; i<50 ;i++) {System.out.println("MainThread: "+ i);}}
}class Runner6 extends Thread{public void run() {System.out.println(Thread.currentThread().isAlive());for(int i = 0;i<50;i++) {System.out.println("SubThread: " + i);}}
}


----------------------------------------------------------------------------------------------------------------

----------------------------------------------------------------------------------------------------------------

线程同步



自身是一个线程类。

分析内存:


分析完内存,我们运行一下:

package com.zhj.www;public class TestSync implements Runnable{Timer timer  =new Timer();public static void main(String[] args) {TestSync testSync = new TestSync();Thread t1 = new Thread(testSync);Thread t2 = new Thread(testSync);t1.setName("t1");t2.setName("t2");t1.start();t2.start();}public void run() {timer.add(Thread.currentThread().getName());}
}class Timer{private static int num = 0;public void add(String name ) {num++;try {Thread.sleep(1);} catch (InterruptedException e) {}System.out.println(name+",你是第"+num+"个使用timer的线程");}
}

运行一下:

结果为什么是这样呢?感觉哪里不对。

线程在执行这个方法时,被另一个线程打断了。写sleep,是为了

放大这个效果。

怎么解决呢?

在执行的时候,锁定当前对象。一个执行进入到锁住区域时,另一个

线程不可打扰。

如下:

public void add(String name ) {synchronized (this) {num++;try {Thread.sleep(1);} catch (InterruptedException e) {}System.out.println(name+",你是第"+num+"个使用timer的线程");}}

互斥锁。

另外简便的写法:

public  synchronized void add(String name ) {//synchronized (this) {num++;try {Thread.sleep(1);} catch (InterruptedException e) {}System.out.println(name+",你是第"+num+"个使用timer的线程");//}}

执行这个方法时,锁住当前对象。

睡着的时候,依然抱着这把锁,其他的人如果要执行这个方法必须等他执行完这个方法。



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

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

相关文章

移动互联网下一步:“深度学习”配合大数据

随着电子商务不断深入&#xff0c;百度、腾讯、阿里巴巴的移动互联网战略的可比性越来月低&#xff0c;如今百度的移动互联网的战略也面临挑战&#xff0c;最大的因素在于数据的来源。 对于互联网的公司最近的动态是什么&#xff1f;这个不是很难的&#xff0c;主要看一下公司的…

windows挂载linux网络文件系统NFS

ubuntu上安装配置nfs服务 #apt-get install nfs-kernel-server #mkdir /home/nfs #vim /etc/exports 在文档的最后一行加入/home/nfs *(rw,sync,no_root_squash,no_subtree_check)&#xff0c;保存退出。 #/etc/init.d/rpcbind restart 重启rpcbind #/etc/init.d/nfs-kern…

SQL的连接分为三种:内连接、外连接、交叉连接。

先给出两张表&#xff1a;一、内连接&#xff1a;内连接&#xff08;INNER JOIN&#xff09;&#xff1a;有两种&#xff0c;显式的和隐式的&#xff0c;返回连接表中符合连接条件和查询条件的数据行。&#xff08;所谓的链接表就是数据库在做查询形成的中间表&#xff09;。1、…

如何在使用摩托罗拉上的RSS阅读器应用进行一次订阅

订阅一个CSDN的RSS为例。 1、打开RSS阅读器。 2、设置->新增订阅->手动新增 订阅URL:输入http://articles.csdn.net/api/rss.php?tid1000 &#xff08;可以先在PC上打开下该网页&#xff0c;发现他是一个xml网页。&#xff09; 订阅名称&#xff1a;自己起一个名字&…

RTP与RTCP协议介绍

本文转自&#xff1a;http://blog.51cto.com/zhangjunhd/25481 1&#xff0e;流媒体( Streaming Media) 1.1流媒体概念 流媒体技术是网络技术和多媒体技术发展到一定阶段的产物。术语流媒体既可以指在网上传输连续时基媒体的流式技术,也可以指使用流式技术的连续时基媒体本身…

JSP学习

一、JSP 简介 什么是Java Server Pages? JSP全称Java Server Pages&#xff0c;是一种动态网页开发技术。它使用JSP标签在HTML网页中插入Java代码。标签通常以<%开头以%>结束。 JSP是一种Java servlet&#xff0c;主要用于实现Java web应用程序的用户界面部分。网页开发…

Java给定一个字符串数组,判断每个字符出现次数

题目要求&#xff1a;给定一个字符串&#xff0c;判断每个字符出现多少次&#xff1f; 解决思路&#xff1a;利用Map的特性&#xff1a;即Map集合中如果两个key&#xff08;键&#xff09;值是一样相同的&#xff0c;那么&#xff0c;后放&#xff08;put&#xff09;入的值会将…

Java-n个人报数

题目&#xff1a; 有n个人围成一圈&#xff0c;顺序排号。从第一个人开始报数&#xff08;从1到3报数&#xff09;&#xff0c;凡报到3的人退出圈子&#xff0c;问最后留下的是原来第几号的哪一位&#xff1f; 大概思路&#xff1a;假设有3个人&#xff0c;它们围成一圈&#x…

100个直接可以拿来用的JavaScript实用功能代码片段

http://www.cnblogs.com/wxydigua/p/3314274.html转载于:https://www.cnblogs.com/kevinge/p/3316315.html

[转]JS Cookie 中文乱码

首先是一个解析cookie的函数&#xff1a; <script type"text/javascript"> function getCookie(name) { var cookies document.cookie.split(";"); for(var i0;i<cookies.length;i) { var cookie cookies[i]; var cookieStr cookie.…

Java线程中关于Synchronized的用法

synchronized是Java中的关键字&#xff0c;是一种同步锁。它修饰的对象有以下几种&#xff1a; 1. 修饰一个代码块&#xff0c;被修饰的代码块称为同步语句块&#xff0c;其作用的范围是大括号{}括起来的代码&#xff0c;作用的对象是调用这个代码块的对象&#xff1b; 2. 修饰…

cmd命令行设置环境变量

http://blog.sciencenet.cn/blog-51026-566742.html 1、查看当前所有可用的环境变量&#xff1a;输入 set 即可查看。 2、查看某个环境变量&#xff1a;输入 “set 变量名”即可&#xff0c;比如想查看path变量的值&#xff0c;即输入 set path。 3、修改环境变量 &#xff1a;…

Java线程之多线程与多进程(1)——以操作系统的角度述说线程与进程

任务调度 线程是什么&#xff1f;要理解这个概念&#xff0c;须要先了解一下操作系统的一些相关概念。大部分操作系统(如Windows、Linux)的任务调度是采用时间片轮转的抢占式调度方式&#xff0c;也就是说一个任务执行一小段时间后强制暂停去执行下一个任务&#xff0c;每个任务…

用 PS 调整服务器时间

用 PS 调整服务器时间 Powershell 有一个命令用来调整计算机的时间&#xff0c; Set-Date -Adjust&#xff0c;但是&#xff0c;只能调整本地时间&#xff0c;不能调整远程的计算机时间。 function AdjustDCTime ( $Server, $addTime ){ $Svr Get-WmiObject Win32_Operatin…

Java线程之多线程与多进程(2)——线程优先级与线程安全

线程优先级 现在主流操作系统(如Windows、Linux、Mac OS X)的任务调度除了具有前面提到的时间片轮转的特点外&#xff0c;还有优先级调度(Priority Schedule)的特点。优先级调度决定了线程按照什么顺序轮流执行&#xff0c;在具有优先级调度的系统中&#xff0c;线程拥有各自的…

mahout贝叶斯算法开发思路(拓展篇)1

首先说明一点&#xff0c;此篇blog解决的问题是就下面的数据如何应用mahout中的贝叶斯算法&#xff1f;&#xff08;这个问题是在上篇&#xff08;。。。完结篇&#xff09;blog最后留的问题&#xff0c;如果想直接使用该工具&#xff0c;可以在mahout贝叶斯算法拓展下载&#…

Java线程之多线程与多进程(3)——Java中的多线程

单线程 任何程序至少有一个线程&#xff0c;即使你没有主动地创建线程&#xff0c;程序从一开始执行就有一个默认的线程&#xff0c;被称为主线程&#xff0c;只有一个线程的程序称为单线程程序。如下面这一简单的代码&#xff0c;没有显示地创建一个线程&#xff0c;程序从mai…

几种常用控件的使用方法

1.UIActivityIndicatorView的使用 UIActivityIndicatorView *activity[[[UIActivityIndicatorViewalloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]autorelease]; z [activity setFrame:CGRectMake(150,150, 50, 50)]; [self.window addSubview:activ…

Java-正则表达式

什么是正则表达式&#xff1f; 正则表达式(Regular Expression)就是用某种模式去匹配一类字符串的公式。如你要在一篇文章中查找第一个字是“李”最后一个字是“建”的三个字的姓名&#xff0c;即“李*建”&#xff1b;那么“李*建”就是公式&#xff0c;也称作模式(Pattern)&a…

tab标签的另一种写法

<div class"good"><ul><li><span>歌曲精选</span></li><li class"other"><span>MV精选</span></li></ul><div class"music_good"><p><span>丁当</span…