java多线程编程核心技术学习-1
实现多线程的两种方式
继承Thread类,重写Thread类中的run方法
public class MyThread extends Thread{
@Override
public void run(){
super.run();
System.out.println("this is myThread run");
}
}
public static void main(String[] args) {
Thread myThread=new MyThread();
myThread.start();
System.out.println("mian function is over");
}
注意:代码的顺序并不是线程的执行顺序,start的顺序也不是多个线程的执行顺序。
实现Runable接口
java是单继承的,一个子类只能去继承一个父类,所以如果线程类已经继承了其他父类,那么就不能采用继承thread类来实现多线程了
public class MyRunnable implements Runnable {
@Override
public void run() {
System.out.println("this is myrunable running");
}
}
public class Test {
public static void main(String[] args) {
Runnable myRunnable=new MyRunnable();
Thread thread=new Thread(myRunnable);
thread.start();
System.out.println("main is runing");
}
}
实例变量与线程安全:
数据不共享的实例,两个线程中分别创建了两个thread实例,各种都是独立的count
public class MyThread extends Thread{
private int count=5;
public MyThread(String name) {
super();
this.setName(name);
}
@Override
public void run(){
super.run();
while(count>0){
count--;
System.out.println(this.currentThread().getName());
System.out.println(count);
}
}
}
public class Test {
public static void main(String[] args) {
Thread thread1=new MyThread("A");
Thread thread2=new MyThread("B");
thread1.start();
thread2.start();
}
}
数据共享的实例
public class MyThread extends Thread {
private int count = 5;
@Override
public void run() {
super.run();
count--;
System.out.println(this.currentThread().getName()+count);
}
}
public class Test {
public static void main(String[] args) {
Thread thread=new MyThread();
Thread thread1=new Thread(thread, "A");
Thread thread2=new Thread(thread,"B");
Thread thread3=new Thread(thread, "C");
thread1.start();
thread2.start();
thread3.start();
}
}
可以在方法上加同步锁,syschronized,这样每一个线程在执行这个方法前需要先尝试去获取这把锁,获取不到就会等待,一直到获取到。
public class MyThread extends Thread {
private int count = 5;
@Override
synchronized public void run() {
super.run();
count--;
System.out.println(this.currentThread().getName()+count);
}
}
下面是一个多线程非安全对的共享变量实例:
在实例中共享了静态变量usanameRef和passwordRef
public class Alogin extends Thread{
@Override
public void run(){
LoginServlet.doPost("a", "aa");
}
}
public class Blogin extends Thread{
@Override
public void run(){
LoginServlet.doPost("b", "bb");
}
}
public class LoginServlet {
private static String usenameRef;
private static String passwordRef;
synchronized public static void doPost(String usename,String password){
try {
usenameRef=usename;
if(usename.equals("a")){
Thread.sleep(2000);
}
passwordRef=password;
System.out.println("username="+usenameRef+"password="+password);
} catch (Exception e) {
e.printStackTrace();
}
}
}
public class Test {
public static void main(String[] args) {
Alogin alogin=new Alogin();
alogin.start();
Blogin blogin=new Blogin();
blogin.start();
}
}
参考: 《java多线程编程核心技术》
https://blog.csdn.net/iaiti/article/details/53314149
java多线程编程核心技术学习-1的更多相关文章
- Java多线程编程核心技术---学习分享
继承Thread类实现多线程 public class MyThread extends Thread { @Override public void run() { super.run(); Sys ...
- 《java多线程编程核心技术》(一)使用多线程
了解多线程 进程和多线程的概念和线程的优点: 提及多线程技术,不得不提及"进程"这个概念.百度百科对"进程"的解释如下: 进程(Process)是计算机中的程序 ...
- Java多线程编程核心技术(三)多线程通信
线程是操作系统中独立的个体,但这些个体如果不经过特殊的处理就不能成为一个整体.线程间的通信就是成为整体的必用方案之一,可以说,使线程间进行通信后,系统之间的交互性会更强大,在大大提高CPU利用率的同时 ...
- Java多线程编程核心技术(二)对象及变量的并发访问
本文主要介绍Java多线程中的同步,也就是如何在Java语言中写出线程安全的程序,如何在Java语言中解决非线程安全的相关问题.阅读本文应该着重掌握如下技术点: synchronized对象监视器为O ...
- Java多线程编程核心技术(一)Java多线程技能
1.进程和线程 一个程序就是一个进程,而一个程序中的多个任务则被称为线程. 进程是表示资源分配的基本单位,线程是进程中执行运算的最小单位,亦是调度运行的基本单位. 举个例子: 打开你的计算机上的任务管 ...
- Java多线程编程核心技术---对象及变量的并发访问(二)
数据类型String的常量池特性 在JVM中具有String常量池缓存的功能. public class Service { public static void print(String str){ ...
- Java多线程编程核心技术
Java多线程编程核心技术 这本书有利于对Java多线程API的理解,但不容易从中总结规律. JDK文档 1. Thread类 部分源码: public class Thread implements ...
- 《Java多线程编程核心技术》推荐
写这篇博客主要是给猿友们推荐一本书<Java多线程编程核心技术>. 之所以要推荐它,主要因为这本书写得十分通俗易懂,以实例贯穿整本书,使得原本抽象的概念,理解起来不再抽象. 只要你有一点点 ...
- 《Java 多线程编程核心技术》- 笔记
作为业务开发人员,能够在工作中用到的技术其实不多.虽然平时老是说什么,多线程,并发,注入,攻击!但是在实际工作中,这些东西不见得用得上.因为,我们用的框架已经把这些事做掉了. 比如web开发,外面有大 ...
随机推荐
- ulrlib案例-爬取百度贴吧
1.任务需求 百度贴吧有很多主题,每个主题下的网页存在很多分页.爬取不同的主题,并下载每个主题下的多页网页. 输入贴吧名称,下载相应贴吧的多页网页,设置最多下载50页. 2.分析网页 访问不同的百度贴 ...
- 判断一个链表是否为回文结构 【题目】 给定一个链表的头节点head,请判断该链表是否为回 文结构。 例如: 1->2->1,返回true。 1->2->2->1,返回true。 15->6->15,返回true。 1->2->3,返回false。 进阶: 如果链表长度为N,时间复杂度达到O(N),额外空间复杂 度达到O(1)。
方式1:借助栈 空间辅助度是O(N) 方式2: 借助栈 空间复杂度是 O(n/2).只存后半个链表 方式3: 反转后半个链表 最后再反转回来 package my_basic.class_3; im ...
- ES6新增"Promise"可避免回调地狱
Promise是一个构造函数,自己身上有all.reject.resolve这几个眼熟的方法,原型上有then.catch等同样很眼熟的方法. 那就new一个 var p = new Promise( ...
- HibernateDaoSupport类的底层中hql操作使用
spring的ApplicationContex.xml 中配置 sql 查询方法: 加载数据源的两种方式: <!--方式一:使用 c3p0 连接池 加载数据源 --> <bean ...
- Greenplum/Deepgreen(单机/伪分布)安装文档
Greenplum/Deepgreen数据库安装(单机/伪分布) 首先去官网下载centos7:https://www.centos.org/download/,选择其中一个镜像下载即可,网上随意下载 ...
- 使用xib开发界面
使用xib开发界面 2015-02-02 10:03 编辑: suiling 分类:iOS开发 来源:jymn_chen‘s blog 纯代码写界面有时候会降低开发效率,对于一些通用简单的界面,例 ...
- vue循环出来列表里面的列表点击click事件只对当前列表有效;
<div id="app"> <div class=‘b’ v-for='item in items' @click="toggle(item)&quo ...
- 洛谷 P2872 道路建设
https://www.luogu.org/problemnew/show/P2872 算是比较裸的并查集了,已经有路的两个点之间建一条代价为0的边,路径长度计算两点之间的距离,做并查集就好咯. #i ...
- 【Java_基础】并发、并行、同步、异步、多线程的区别
1. 并发:位于同一个处理器上的多个已开启未完成的线程,在任意一时刻系统调度只能让一个线程获得CPU资源运行,虽然这种调度机制有多种形式(大多数是以时间片轮巡为主).但无论如何,都是通过不断切换需要运 ...
- Django REST framework 的功能
1. 认证Authentication 方法一:在配置文件中配置全局默认的认证方案 REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': ( 're ...