Java多线程(一) 多线程的基本使用
在总结JDBC数据库连接池的时候,发现Java多线程这块掌握得不是很好,因此回头看了下多线程的内容。做一下多线程模块的学习和总结,稳固一下多线程这块的基础。关于多线程的一些理论知识,这里不想啰嗦太多,可以进行下搜索了解。
1. 如何使用Java创建多线程
使用Java多线程,总的来说方法有两种:①继承Thread类,重写run方法 ②把相关的类实现Runnable(可运行)接口,重写run方法。③实现Callable接口(相对用得较少)
- package com.scl.thread;
- public class TestThread
- {
- public static void main(String[] args) throws Exception
- {
- String mainName = Thread.currentThread().getName();
- System.out.println(mainName + "线程开始运行");
- // 方法1 使用继承对线程进行调用
- MyThread myThread = new MyThread();
- myThread.setName("wft");
- myThread.start();
- myThread.join();
- // 方法2 继承Runnable接口进行调用
- Thread thread = new Thread(new MyRunnable());
- thread.start();
- System.out.println(mainName + "线程结束");
- }
- }
- // 使用runnable开启线程
- class MyRunnable implements Runnable
- {
- @Override
- public void run()
- {
- // 获取调用线程的名字
- String curName = Thread.currentThread().getName();
- System.out.println(curName + "线程启动");
- try
- {
- Thread.sleep(1000);
- System.out.println(curName + "正在运行");
- }
- catch (InterruptedException e)
- {
- e.printStackTrace();
- }
- System.out.println(curName + "线程结束");
- }
- }
- // 使用Thread进行run方法的编写,开启线程
- class MyThread extends Thread
- {
- // Thread.currentThread()调用这个方法的线程名称。
- String s = Thread.currentThread().getName(); // 调用这个类的是main方法调用,run方法交由新线程操作
- public MyThread()
- {
- System.out.println("Thread.currentThread().getname()=" + Thread.currentThread().getName());
- // 线程没运行前初始化的名字.因为类的初始化跟线程运行无关,这里返回的是处世话的名字
- System.out.println("This.getName=" + this.getName());
- }
- @Override
- public void run()
- {
- // run方法交由新线程操作,所以调用的名称不是main
- String strName = Thread.currentThread().getName();
- System.out.println("this.getName " + this.getName());
- // main
- System.out.println("do u no s?" + s);
- System.out.println(strName + " 开始数数");
- for (int i = 0; i < 100; i++)
- {
- System.out.println(strName + " " + i);
- }
- System.out.println(strName + " 数数完毕");
- }
- // 返回设置的name
- public String bName()
- {
- return this.getName();
- }
- }
最应该注意的是给线程标注名称的时候,应该多使用Thread.currentThread().getname() 来获取线程名称。使用this.getName方法很容易出错。
主要该注意的有如下两个:
① 获取名称不在run方法里面,永远返回名称为main。因为在构造线程类的时候,主线程main会进行代码的初始化。run方法由新创建起来的线程去调用,这样run方法里面的名称才能被正确获取到
② 在继承类的构造函数内,如上面MyThread的构造函数内调用getName()方法。该方法是由JDK 源码Thread类继承而来。new一个Thread实例时,系统会调用Thread
下的方法,代码如下
- //Thread 类构造函数
- public Thread() {
- init(null, null, "Thread-" + nextThreadNum(), 0);
- }
- // 私有的init方法
- private void init(ThreadGroup g, Runnable target, String name,long stackSize) {
- init(g, target, name, stackSize, null);
- }
- //init 方法. 更详细内容见JDK源码Thread类363行
- private void init(ThreadGroup g, Runnable target, String name,long stackSize, AccessControlContext acc)
所以在构造器内的初始化的时候调用init方法给线程设置name字段。导致参数名称修改且以"Thread-"开头。初始化完毕后,如果用户设置过相关的线程名称,系统会把该字段进行修改,可以运用上述代码中的bName()函数进行验证。
在使用Java多线程的时候,不要直接调用某个实例下的run方法,如果直接使用run方法。则直接调用,不会开辟新的线程进行功能操作。
继承Thread和实现Runnable接口的区别:
① 继承Thread能够简单地实现线程开辟,但由于Java只支持单继承。继承Thread方法实现线程会有比较多的局限性
② 实现Runnable接口能够很好的将线程代码和业务逻辑代码分离,但代码结构相对复杂。一般都会使用实现Runnable方法创建线程。
2. Java多线程下常用方法
① join( ) 多线程是有cpu分配执行时间片段,如果要控制线程操作流程,则需要使用到join方法。join方法会阻塞主线程,主线程会等待join方法的线程执行完毕再继续执行后续的操作。同时join方法可以添加时间,让主线程等待一段时间,如果时间过了。则不再等待继续执行。如:thread.join( ),当主线程编译到该代码时,主线程会停止下来等待thread线程执行完毕后,主线程再继续后续操作
② sleep( ) 不释放锁资源,让调用的线程进行等待。如:thread.sleep( ) ,但代码执行到这一句时,thread会停止下来等待,直到被唤醒或者等到到sleep到的时间点后再进行后续操作。
③ wait( )和notify( )、notifyAll( ) 。这三个方法主要处理线程同步数据时使用。数据同步,也就是几条线程在同时修改一份共享数据。如火车站5名销售员同时在售卖火车票,火车票是固定数量的前提下,如何实现这5名销售员同时知道火车票库存、同一路段火车票售卖、车票信息共享等。
wait方法使当前线程暂停执行并释放对象锁标志。notify和notifyall方法会唤醒几个等待的线程,让线程重新获取锁代码以便后续进行。线程状态图表如下:
关于使用锁以及线程状态内容,将在下一篇博文进行总结,上述内容若有问题,烦请指出纠正。
Java多线程(一) 多线程的基本使用的更多相关文章
- 0037 Java学习笔记-多线程-同步代码块、同步方法、同步锁
什么是同步 在上一篇0036 Java学习笔记-多线程-创建线程的三种方式示例代码中,实现Runnable创建多条线程,输出中的结果中会有错误,比如一张票卖了两次,有的票没卖的情况,因为线程对象被多条 ...
- Java学习笔记-多线程-创建线程的方式
创建线程 创建线程的方式: 继承java.lang.Thread 实现java.lang.Runnable接口 所有的线程对象都是Thead及其子类的实例 每个线程完成一定的任务,其实就是一段顺序执行 ...
- Java线程与多线程教程
本文由 ImportNew - liken 翻译自 Journaldev. Java线程是执行某些任务的轻量级进程.Java通过Thread类提供多线程支持,应用可以创建并发执行的多个线程. 应用 ...
- 黑马程序员——JAVA基础之多线程的线程间通讯等
------- android培训.java培训.期待与您交流! ---------- 线程间通讯: 其实就是多个线程在操作同一个资源,但是动作不同. wait(); 在其他线程调用此对象的notif ...
- Java多线程——<八>多线程其他概念
一.概述 到第八节,就把多线程基本的概念都说完了.把前面的所有文章加连接在此: Java多线程——<一>概述.定义任务 Java多线程——<二>将任务交给线程,线程声明及启动 ...
- Java面试题-多线程
1. java中有几种方法可以实现一个线程? 多线程有两种实现方法,分别是继承Thread类与实现Runnable接口. 这两种方法的区别是,如果你的类已经继承了其它的类,那么你只能选择实现Runna ...
- Java面试09|多线程
1.假如有Thread1.Thread2.Thread3.Thread4四条线程分别统计C.D.E.F四个盘的大小,所有线程都统计完毕交给Thread5线程去做汇总,应当如何实现? 把相互独立的计算任 ...
- Java 中传统多线程
目录 Java 中传统多线程 线程初识 线程的概念 实现线程 线程的生命周期 常用API 线程同步 多线程共享数据的问题 线程同步及实现机制 线程间通讯 线程间通讯模型 线程中通讯的实现 @(目录) ...
- 2019/3/7 Java学习之多线程(基础)
Java学习之多线程 讲到线程,就必须要懂得进程,进程是相当于一个程序的开始到结束,而线程是依赖于进程的,没有进程,就没有线程.线程也分主线程和子线程,当在主线程开启子线程时,主线程结束,而子线程还可 ...
- Java编程实现多线程TCP服务器完整实例
Socket ·功能:TCP客户端套接字 ·构造方法: Socket(InetAddress address, int port) 创建一个流套接字并将其连接到指定 IP 地址的指定端口号 · ...
随机推荐
- 解决Download interrupted: Connection to https://dl-ssl.google.com refused的问题
运行->drivers->etc->hosts 加入一行 74.125.237.1 dl-ssl.google.com ok! =================上述方法已经失效, ...
- PHP做好防盗链的基本思想 防盗链的设置方法
盗链是指服务提供商自己不提供服务的内容,通过技术手段绕过其它有利益的最终用户界面(如广告),直接在自己的网站上向最终用户提供其它服务提供商的服务内容,骗取最终用户的浏览和点击率.受益者不提供资源或提供 ...
- Python_爬虫4
Python爬虫入门(8):Beautiful Soup的用法 上一节我们介绍了正则表达式,它的内容其实还是蛮多的,如果一个正则匹配稍有差池,那可能程序就处在永久的循环之中,而且有的小伙伴们也对写正则 ...
- Qt focusoutevent 不响应的解决方法
一般利用focus(焦点)来实现弹窗自动关闭效果. Qt的focus貌似是自己的bug, 经常无法接收到focusout的事件 例如: widgetA 中执行 widgetB->show(); ...
- 小白日记3:kali渗透测试之被动信息收集(二)-dig、whios、dnsenum、fierce
一.DIG linux下查询域名解析有两种选择,nslookup或者dig.Dig(Domain Information Groper)是一个在类Unix命令行模式下查询DNS包括NS记录,A记录,M ...
- 通过 Session 操纵对象
Session 接口是 Hibernate 向应用程序提供的操纵数据库的最主要的接口, 它提供了基本的保存, 更新, 删除和加载 Java 对象的方法. Session 具有一个缓存, 位于缓存中的对 ...
- VC2010 _com_error 返回的错误信息
CString GetComError(const _com_error& e) { CString sMsg; sMsg.Format( _T("HRESULT: 0x%08lx; ...
- [未完成]关于Java网络编程总结
网络的七层结构: 第一层:物理层,网线. 第二层: 数据链路层,交换机.交换机有IP地址.这一层的数据叫做帧 第三层:网络层,数据包方向的定义,路由器.现在也有具有路由功能的交换机.主要将从下层接收到 ...
- 关于使用vss版本管理工具中的sln,suo文件作用
Visual Studio.NET采用两种文件类型(.sln和.suo)来存储特定于解决方案的设置,它们总称为解决方案文件.为解决方案资源管理器提供显示管理文件的图形接口所需的信息 从而在每次继续开发 ...
- js中关于事件处理函数名后面是否带括号的问题
今天总结一个关于事件处理程序的小细节.首先回顾一下事件处理的一些概念. JS中的事件处理(事件绑定)就是让某种或某些事件触发某些活动.有两种常见的形式,分别是DOM Level 0 和DOM Leve ...