关于多线程--网络编程 -- 注解反射的一点笔记(JAVA篇)
一 . 线程
java开启一个线程的方法(三种)
方法一:继承Thread类并New一个线程对象
步骤:
1):定义一个类A继承于Java.lang.Thread类。
class TestThread extends Thread
2):在A类中覆盖Thread类中的run方法。
3):在run方法中编写需要执行的操作。
4):在main方法中,创建线程对象,并启动线程。
//创建一个线程对象,并启动线程.
TestThread Lo = new TestThread();
Lo.start();
注:不要调用run方法,如果调用run方法好比是对象调用方法,依然还是只有一个线程,并没有开启新的线程,正确开启一个线程的是应该调用其Star方法。
线程只能启动一次!
代码示例:
class TestThread extends Thread{
// 覆盖Thread类中的run方法.
public void run() {
System.out.println("阿龙");
}
}
public class ThreadDemo {
public static void main(String[] args) {
// 主线程
System.out.println("运行游戏"+j);
// 再创建一个线程对象,并启动线程.
TestThread Lo = new TestThread();
Lo.start();
}
}
方法二:实现Runnable接口(常用)
步骤:
1):定义一个类实现于java.lang.Runnable接口。
2):在该类中重写run方法。
3):重写run方法体内的操作。
4):在main方法中,创建线程对象,并启动线程。
代码示例:
//定义一个类继承于java.lang.Runnable接口
class Lo implements Runnable{
//重写Runnable接口中的run方法.
public void run() {
System.out.println("Yes~");
}
} public class Demo02 {
public static void main(String[] args) {
System.out.println("主线程"); //在main方法(线程)中,创建线程对象,并启动线程
Lo s = new Lo();
Thread t1 = new Thread(s);
t1.start();
}
}
方法三:实现Callable接口(不常用)
注:Callable接口实际上是属于Executor框架中的功能类,Callable接口与Runnable接口的功能类似,但提供了比Runnable更加强大的功能,如下:
1)Callable可以在任务结束的时候提供一个返回值,Runnable无法提供这个功能。
2)Callable的call方法分可以抛出异常,而Runnable的run方法不能抛出异常。
实现方法的步骤和runable差不多。
public class CallableAndFuture {
static class MyThread implements Callable<String> {
@Override
public String call() throws Exception {
return "Hello world";
}
}
public static void main(String[] args) {
ExecutorService threadPool = Executors.newSingleThreadExecutor();
Future<String> future = threadPool.submit(new MyThread());
try {
System.out.println(future.get());
} catch (Exception e) {
} finally {
threadPool.shutdown();
}
}
}
补充:
关于继承方式和实现方式的区别:
继承方式:
1):从设计上分析,Java中类是单继承的,如果继承了Thread了,该类就不能再有其他的直接父类了。
2):从操作上分析,继承方式更简单,获取线程名字也简单.(操作上,更简单)。
3):从多线程共享同一个资源上分析,继承方式不能做到。
实现方式:
1):从设计上分析,Java中类可以多实现接口,此时该类还可以继承其他类,并且还可以实现其他接口,设计更为合理。
2):从操作上分析,实现方式稍微复杂点,获取线程名字也比较复杂,得使用Thread.currentThread()来获取当前线程的引用。
3):从多线程共享同一个资源上分析,实现方式可以做到(是否共享同一个资源)。
关于线程的常用方法。
1)
Thread.currentThead():获取当前线程对象
2) - - (优先级):线程优先级高,被CPU调度的概率大,但不代表一定会运行,还有小概率运行优先级低的线程。
getPriority():获取当前线程的优先级
setPriority():设置当前线程的优先级
3)
isAlive():判断线程是否处于活动状态 (线程调用start后,即处于活动状态)
4)
join():调用join方法的线程强制执行,其他线程处于阻塞状态,等该线程执行完后,其他线程再执行。有可能被外界中断产生InterruptedException 中断异常。比如:抢票软件的花钱买会员。
5)
sleep():在指定的毫秒数内让当前正在执行的线程休眠(暂停执行)。休眠的线程进入阻塞状态。
6)
yield():调用yield方法的线程,会礼让其他线程先运行。(大概率其他线程先运行,小概率自己还会运行)- - 和join正好反义。
7)
interrupt():中断线程
8) - - (wait方法一般配合另外两个方法一起使用。涉及到一个加锁与释放锁的概念,同时我记得还用过CountDownLatch 门栓机制)
以下方法多用于处理多线程的并发问题,比如双十一抢货,春节抢票等场景。。
wait():导致线程等待,进入堵塞状态。该方法要在同步方法或者同步代码块中才使用的
notify():唤醒当前线程,进入运行状态。该方法要在同步方法或者同步代码块中才使用的
notifyAll():唤醒所有等待的线程。该方法要在同步方法或者同步代码块中才使用的
线程同步的代码示例
死锁问题
剩下的明天再写。。
关于多线程--网络编程 -- 注解反射的一点笔记(JAVA篇)的更多相关文章
- python多线程网络编程
背景 使用过flask框架后,我对request这个全局实例非常感兴趣.它在客户端发起请求后会保存着所有的客户端数据,例如用户上传的表单或者文件等.那么在很多客户端发起请求时,服务器是怎么去区分不同的 ...
- 网络编程 --- URLConnection --- 读取服务器的数据 --- java
使用URLConnection类获取服务器的数据 抽象类URLConnection表示一个指向指定URL资源的活动连接,它是java协议处理器机制的一部分. URL对象的openConnection( ...
- 大数据学习笔记——Java篇之网络编程基础
Java网络编程学习笔记 1. 网络编程基础知识 1.1 网络分层图 网络分层分为两种模型:OSI模型以及TCP/IP网络模型,前者模型分为7层,是一个理论的,参考的模型:后者为实际应用的模型,具体对 ...
- python 多线程网络编程 ( 二 )
背景 我在[第一篇文章中]已经介绍了如何实现一个多线程的todo应用,接下来我将会研究如何使这个服务器完成下面这几个功能. 1.使用正则表达式解析用户发送的请求数据: 2.使用ThreadLocal技 ...
- xml、网络编程、 反射
XML 常用于配置文件.传输数据. <?xml version="1.0" encoding="UTF-8"?><persons> &l ...
- winform 获得局域网内在线IP和计算机名,获取IP,多线程网络编程
转载请注明来源:https://www.cnblogs.com/hookjc/ using System; using System.Collections.Generic; using System ...
- UNIX 网络编程第五章读书笔记
刚看完 UNIX 第五章内容,我想按照自己的方式将自己获得的知识梳理一遍,以便日后查看!先贴上一段简单的 TCP 服务器端代码: #include <sys/socket.h> #incl ...
- UNIX网络编程卷2进程间通信读书笔记(一)—概述
http://blog.chinaunix.net/uid-12868584-id-92807.html 写的灰常好,我就转载了 一.什么是进程间通信 IPC是进程间通信的简称,所谓进程通信,就是不同 ...
- 《Unix网络编程》卷2 读书笔记 第3章- System V IPC
1. 概述 三种类型的System V IPC:System V 消息队列.System V 信号量.System V 共享内存区 System V IPC在访问它们的函数和内核为它们维护的信息上共享 ...
随机推荐
- 如何把C++的源代码改写成C代码?而C改C++只需一步!
★ 如何把C++的源代码改写成C代码? C++解释器比C语言解释器占用的存储空间要大,想要在某些特定场合兼容C++代码,同时为了节省有限的存储空间,降低成本,也为了提高效率,将用C++语言写的源程序用 ...
- ScanTailor-ScanTailor 强大的多方位的满足处理扫描图片的需求
ScanTailor 强大的多方位的满足处理扫描图片的需求 ScanTailor 能做什么? 批量或单张或选择区间旋转图片 自动切割页面,同时提供手动选项 自动识别图像歪斜角度,同时提供手动选项 ...
- Sectigo邮件签名证书安装指南
本篇将详细讲解如何在邮箱客户端安装Sectigo 邮件签名证书. 请先准备好您的邮件签名证书.如已签发未导出,请参照如何导出邮件签名证书的步骤完成准备工作. 本文将以Outlook 邮箱系统为例,在其 ...
- Linux基础命令之.命令
. 点命令 .命令等同source 可以让配置文件被读到进程中,立刻生效
- Java安全之Commons Collections3分析
Java安全之Commons Collections3分析 文章首发:Java安全之Commons Collections3分析 0x00 前言 在学习完成前面的CC1链和CC2链后,其实再来看CC3 ...
- pytest-pyppeteer:在pytest中运行pyppeteer
pytest-pyppeteer pytest-pyppeteer是我写的一个 pytest 插件,支持在 pytest 中运行pyppeteer,起因是为了解决工作中的一个测试需求,现在将其开源并做 ...
- CAS 算法与 Java 原子类
乐观锁 一般而言,在并发情况下我们必须通过一定的手段来保证数据的准确性,如果没有做好并发控制,就可能导致脏读.幻读和不可重复度等一系列问题.乐观锁是人们为了应付并发问题而提出的一种思想,具体的实现则有 ...
- SpringBook+Lombok 使用教程
什么是Lombok? Lombok项目是一个Java库,它会自动插入编辑器和构建工具中,Lombok提供了一组有用的注释,用来消除Java类中的大量样板代码. Lombok也存在一定风险,在一些开发工 ...
- 【转载】HPL与HPCG测试(一)
来源:HPL与HPCG测试 (一) 一.HPL与HPCG 简介 1.HPL HPL 即 High Performance Linpack,它是针对现代并行计算集群的测试工具.用户不修改测试程序,通过调 ...
- STM32入门系列-STM32时钟系统,自定义系统时钟
在时钟树的讲解中我们知道,通过修改PLLMUL中的倍系数值(2-16)可以改变系统的时钟频率.在库函数中也有对时钟倍频因子配置的函数,如下: void RCC_PLLConfig(uint32_t R ...