java多线程论文_Java5 多线程之入门篇-论文

Java5 多线程之入门篇

Java5 多线程之入门篇

首先回顾一下JDK1.5之前的线程相关的知识:

1 线程的入门.

什么是线程,线程就是程序执行的线索,Java是面向对象的语言什么类来表示这样一个东西呢?Thread.

通过start()方法启动它,线程所要执行的任务放在run()方法里面,下面可以看一下run()方法里面的源码

创建线程的两种传统方式(注: Runnable类并不是一个线程,它只是线程一个执行单元):

打开Thread的构造方法,

然后可以跟进看到init()方法具体的实现.其中有一行代码就是对target(Runnable类型)的赋值,因为线程所执行的任务都在run()方法里面,那么在run()方法里面,target就不为null,然后就调用了Runnale的run()方法.因为我们重写了Runnable的run()方法,那么最终执行的就是我们所覆写的run()方法.具体代码如下:

如果我们同时实现了Thread的run()方法又同时覆盖了Runnable的run()方法.那么到底会执行哪个的run()方法呢?

根据Java的多态,肯定执行的是Thread的run()方法.因为我们覆写了Thread的run()方法,那么所执行的就是我们run()方法,而不是

2 传统的定时器:

定时器通过Timer这个类来描述,通过schedule()方法来调度,定时执行的任务通过TimerTask来定义.

下面来实现一个简单的定时器,功能如下,每隔2秒执行一次,之后隔4秒执行一次,然后又隔2秒,就这样轮循下去.具体用法可以查看API里面有详细介绍.

[java] view plaincopy 01.public static void main(String[] args) {

02.    new Timer().schedule(new MyTimerTask(), 2000);

03.    try {

04.        while (true) {

05.        System.out.println(new Date().getSeconds());

06.        Thread.sleep(1000);

07.    }

08.} catch (InterruptedException e) {

09.    e.printStackTrace();

10.        }

11.    }

12.    }

13.class MyTimerTask extends TimerTask {

14.    static int count = 0;

15.    @Override

16.    public void run() {

17.        count = (count + 1) % 2;//count=0或1

18.        System.out.println("boming");

19.        Timer timer = new Timer();

20.        timer.schedule(new MyTimerTask(), 2000 + (2000) * count);

21.    }

3 线程之间的互斥和同步通信

当两个线程去同时操作一个字符串,那么可能会出现线程安全问题.这样的情况可以用银行转帐来解释.

下面的代码就会出现问题,

[java] view plaincopy 01.public static void main(String[] args) {

02.final Outputer outputer = new Outputer();

03.new Thread() {

04.@Override

05.public void run() {

06.while (true) {

07.try {

08.Thread.sleep(100);

09.} catch (InterruptedException e) {

10.e.printStackTrace();

11.}

12.outputer.print("zhangsan");

13.}

14.}

15.}.start();

16.new Thread() {

17.@Override

18.public void run() {

19.while (true) {

20.try {

21.Thread.sleep(100);

22.} catch (InterruptedException e) {

23.e.printStackTrace();

24.}

25.outputer.print("zhangxiaoxiang");

26.}

27.}

28.}.start();

29.}

30.}

31.class Outputer {

32.public void print(String name) {

33.for (int i = 0; i < name.length(); i++) {

34.System.out.print(name.charAt(i));

35.}

36.System.out.println();// 打印完字符串换行

37.}

38.}

我们使用两个线程去调用print(String name)方法,当第一个方法还没有执行完毕,第二个方法来执行,那么打印出来的name就会出现为问题.如下图所示,

现在我们要实现的是,只有当第一个线程执行完毕后,第二个线程才能执行print(String name)方法,这就必须互斥或者说同步.

我们知道实现同步可以使用同步代码块或者同步方法,想到同步(Synchronized)那么自然而然就想到同步监视器.

这是两个很重要的概念.

现在我们来改造上面Outputer的print(String name)方法.

[java] view plaincopy 01.public void print(String name) {

02.//synchronized()里面的参数就是同步监视器

03.//然而这里使用name作为同步监视器是不行的,

04.//因为要实现原子性(互斥)必须要使用同一个监视器对象

05.//当第一个线程来执行该代码块,name对象是一个String对象

06.//当第二个线程来执行,name对象又是另一个String对象,

07.//这样就不能实现同步

08.synchronized (name) {

09.for (int i = 0; i < name.length(); i++) {

10.System.out.print(name.charAt(i));

11.}

12.System.out.println();// 打印完字符串换行

13.}

14.}

执行结果如下所示:

我们可以通过this关键字作为同步监视器,因为从上面定义两个线程的代码来看,我们只new了一次Outputer对象,所以this代表同一个对象.

现在来通过同步方法来实现同步,

[java] view plaincopy 01.//同步方法也同样也有同步监视器,它是this

02.public synchronized void print2(String name) {

03.    for (int i = 0; i < name.length(); i++) {

04.        System.out.print(name.charAt(i));

05.    }

06.    System.out.println();// 打印完字符串换行

07.}

把第二个线程改成使用print2(String name)方法.这样的话就需要p

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

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

相关文章

xp怎么升级到win7

使用云骑士软件前注意电脑磁盘至少要2个以上&#xff0c;同时备份好C盘上的重要资料&#xff0c;包括桌面文件和聊天记录等等。 打开浏览器&#xff0c;在云骑士官网下载云骑士一键重装系统软件&#xff0c;下载好以后打开云骑士装机大师&#xff0c;点击一键装机页面下的立即…

brew php7 intl_brew安装php7

设置brewbrew tap homebrew/dupesbrew tap homebrew/versionsbrew tap homebrew/homebrew-php安装php7brew install php70 \--without-snmp \--without-apache \--with-debug \--with-fpm \--with-intl \--with-homebrew-curl \--with-homebrew-libxslt \--with-homebrew-opens…

电脑怎么备份系统

电脑怎么备份系统?下面就与大家分享电脑备份系统的方法。 可以使用电脑的备份功能。 1 第一步 右键点击此电脑&#xff0c;选择属性&#xff0c;选择左侧菜单中的系统保护选项 电脑怎么备份系统 电脑怎么备份系统(1) 2 第二步 点击配置&#xff0c;勾选启用系统保护&#…

php求北京时间方法,php怎么将获得的时间转换为北京时间

从php5.10开始&#xff0c;php中加入了时区的设置&#xff0c;在php中显示的时间都是格林威治标准时间&#xff0c;这就造成了我们中国的用户会差八个小时的问题&#xff01;相关设置是修改php.ini中的 date.timezone 参数&#xff1a;[Date]; Defines the default timezone us…

php sql desc,PHP SQL 查询封装

/*** SQL 简单查询工具类* * $tools new SQLTools("表名", "数据库操作对象实例");*$tools->query("字段默认为*") //(如无后续操作此处返回查询结果集)* ->where( 条件, PDO参数化查询参数 ) //(如无后续操作此处返回查询结果集)* ->…

彩虹浏览器使用技巧:页签自动切换

核心提示&#xff1a;彩虹66760设计了创新的页签自动切换功能&#xff0c;当鼠标移动到某个页签时&#xff0c;无需要点击就能自动激活您所想打开的网页&#xff0c;这个功能是不是很酷很炫呢&#xff0c;为大家节约一点小时间。 1&#xff0c;悬停换页 彩虹浏览器设计了创新…

php 的不等于符号,mysql 不等于 符号写法

经过测试发现mysql中用<>与!都是可以的&#xff0c;但sqlserver中不识别!,所以建议用<>selece * from zzvips where id<>45sql 里 符号<> 于 ! 的区别<> 与!都是不等于的意思&#xff0c;但是一般都是用<>来代码不等于因为<>在任何S…

腾讯视频怎么禁止别人登录我的会员

一旦你有了腾讯视频的vip会员账号&#xff0c;那么不管你是朋友眼中&#xff0c;还是在那些盗号的眼中&#xff0c;你就是非常诱人的&#xff0c;那么我们怎么设置才能够禁止别人登录自己的会员账号呢?跟着小编的节奏&#xff0c;带你安全设置腾讯视频vip账号。 首先&#xf…

php数组交集方法,PHP获得数组交集与差集的方法

本文实例讲述了PHP获得数组交集与差集的方法。分享给大家供大家参考。具体分析如下&#xff1a;一、数组的交集 array_intersect()array_intersect()函数返回一个保留了键的数组&#xff0c;这个数组只由第一个数组中出现的且在其他每个输入数组中都出现的值组成。其形式如下&a…

如何获取优酷视频的通用代码?

在网站建设中&#xff0c;假如置入视頻&#xff0c;则必须该视頻所属视频平台的通用性编码&#xff0c;比如某一视频在优酷网的通用性编码。拷贝该通用性编码在自身的网址&#xff0c;大家就可以自身在自身网址收看&#xff0c;无需自动跳转优酷网站。如何获取优酷视频的通用代…

一般java,【面试题】java一般

1、取最大最小值public static int maxOrMinTest(List list){Integer[] integers list.toArray(new Integer[0]);int max integers[0];for (int a1;aif (max < integers[a]){max integers[a];}}return max;}2、冒泡排序public static List sortTest(List list){Integer[]…

如何在金山毒霸软件里安装腾讯视频

有很多软件管理工具&#xff0c;金山毒霸不仅仅是杀毒软件&#xff0c;也是软件管理工具&#xff0c;对于一些电脑小白用户来说&#xff0c;在这里也可以非常方便的一键下载安装自己想要的软件&#xff0c;比如腾讯视频&#xff0c;这个其实和360软件管家是一样的道理&#xff…

java使用wsdlreader,Java WSDLReader.setFeature方法代碼示例

本文整理匯總了Java中javax.wsdl.xml.WSDLReader.setFeature方法的典型用法代碼示例。如果您正苦於以下問題&#xff1a;Java WSDLReader.setFeature方法的具體用法&#xff1f;Java WSDLReader.setFeature怎麽用&#xff1f;Java WSDLReader.setFeature使用的例子&#xff1f;…

如何进行系统还原

在我们使用电脑的时候有时候要对系统进行还原&#xff0c;那么你知道如何进行系统还原吗?不知道的小伙伴一起来操作一遍吧。 1 第一步 鼠标单击左下角的开始菜单&#xff0c;选择设置&#xff0c;进入页面 如何进行系统还原 2 第二步 单击更新和安全&#xff0c;选择左侧的恢…

搜狐视频开放平台的申请使用方法

软件是否好用&#xff0c;还得大家下载搜狐视频安装才知道。本文分享搜狐视频开放平台的申请使用方法。搜狐视频电脑版是电脑桌面客户端应用&#xff0c;用户只要登录帐号就能够拥有云同步功能&#xff0c;无论是在家、出差都可以查看自己的视频观看记录&#xff0c;随时追剧。…

java guava限流,Guava的RateLimiter实现接口限流

最近开发需求中有需要对后台接口进行限流处理&#xff0c;整理了一下基本使用方法。首先添加guava依赖:com.google.guavaguava23.0然后封装RateLimiter适用对多接口的限制:import com.google.common.util.concurrent.RateLimiter;import org.springframework.util.StringUtils;…

电脑系统重装后没有声音怎么办​

电脑系统重装后没有声音怎么办&#xff0c;下面与大家分享下系统重装后没有声音怎么解决的教程。 1 第一步 鼠标右键单击此电脑&#xff0c;选择管理进入页面&#xff0c;单击设备管理器&#xff0c;展开声音、视频和游戏控制器&#xff0c;查看设备是否有问号&#xff0c;如果…

模糊聚类划分matlab代码,Matlab协同模糊聚类建模

%本程序实现了把协同模糊聚类算法和G-K算法相结合,构建T-S模型%并用该模型对数据进行测试%输入数据:%ytrain:训练数据的实际输出,是一个列向量%xtrain:训练数据矩阵,分为两组,每组的每行代表一个特征.每组特征不同%ytest:测试数据的实际输出,是一组列向量%xtest:测试数据矩阵,其…

php并发取源码,PHP读取大文件源码示例-Swoole多进程读取大文件

PHP读取大文件源码示例&#xff0c;通过PHP读取过大、超大型文件的思路及解决方案。在日常读取文件时&#xff0c;若文件 不是很大&#xff0c;通常使用file_get_contents,将内容一次性载入的变量中&#xff0c;也可以远程加载网页或者远端文件。若加载超过PHP限制的内存大小&a…

QQ如何设置会话窗默认使用腾讯视频播放视频文件

小编给大家整理了大量腾讯视频的使用方法和问题解决办法&#xff0c;这篇文章依然非常有价值&#xff0c;如果你遇到“QQ如何设置会话窗默认使用腾讯视频播放视频文件”方面的问题&#xff0c;赶紧看看吧。腾讯视频播放器推荐精准&#xff0c;越用越懂你&#xff0c;分秒就能计…