java----线程篇
一个线程是进程内的一个单一的顺序控制流程图,多线程是指一个进程可以同时运行几个任务,每个任务由一个线程来完成。即多个线程可以同时运行,并且在一个进程内执行不同的任务。
1.创建线程两种方法方法一,
继承自Thread:
(1).定义一个类继承Thread类(2).覆盖Thread中的run()方法(3).直接创建Thread类的对象并测试线程。(4).调用线程的start方法,开启线程并调用线程的run方法并执行。
class Demo extends Thread{
String name;
Demo(String name){
super(name);
//this.name=name;
}
@Override
public void run() {
for(int i=0;i<10;i++){
System.out.println(name+"................."+i+"......name="+Thread.currentThread().getName());
}
}
}
public class ThreadDemo {
public static void main(String[] args) {
//三个线程,主线程和其他俩个线程
Demo d1=new Demo("xia");
Demo d2=new Demo("里面");
d1.start();
d2.start();
System.out.println("over======="+Thread.currentThread().getName());
}
}
(程序结束,但是线程不一定结束。)
2.实现Runnable接口--------->将线程对象的任务从线程的子类中分离出来,进行单独的封装,按照面向对象的思想将任务封装成对象,避免的java的单继承。
(1).定义类实现Runnable接口(2).覆盖接口中的run方法,将线程的任务代码封装到run方法中(3).通过Thread类创建线程对象,并将Runnable接口的子类对象作为Thread类的构造函数的参数进行传递(4).调用线程对象的start方法开启线程
class Ticket implements Runnable {
private int num = 100;
int j=0;
public void run() {
while (true) {
synchronized (this) {
if (num > 0){
j++;
//Thread.currentThread().getName()是获取当前线程的名字,Thread-编号,其中编号是从0开始的。
System.out.println(j+"==="+Thread.currentThread().getName() + "-----------" + num--);
}
else
break;
}
}
}
}
public class ThreadDemo1 {
public static void main(String[] args) {
Ticket t = new Ticket();
Thread t1 = new Thread(t);
Thread t2 = new Thread(t);
Thread t3 = new Thread(t);
Thread t4 = new Thread(t);
t1.start();
t2.start();
t3.start();
t4.start();
}
}
run()方法:run方法中定义的就是线程要运行的任务代码,开启线程是为了运行指定代码,所有只有继承了Thread类,复写run方法,将运行的代码定义到run方法中进行
2.线程的同步问题
线程的安全产生的原因:多个线程在操作共享的数据,或,操作共享数据的线程代码有多条
当线程在执行共享操作共享数据的多条代码,其他线程参与运算就会导致线程安全问题的产生。
线程同步的处理方式:
创建同步方法:
package my1.exa.dao;
class Bank{
private int sum;
synchronized void add(int money){
sum=sum+money;
System.out.println(sum);
}
}
class Costum implements Runnable{
Bank b=new Bank();
@Override
public void run() {
for(int i=0;i<3;i++){
b.add(100);
}
}
}
public class SyncThreadDemo {
public static void main(String[] args) {
Costum co=new Costum();
Thread th1=new Thread(co);
Thread th2=new Thread(co);
th1.start();
th2.start();
}
}
创建同步代码块:
class Ticket1 implements Runnable {
private static int num = 100;
Object ob=new Object();
public void run() {
while (true) {
synchronized (ob) {
if (num > 0){
System.out.println(Thread.currentThread().getName() + "------obj-----" + num--);
}
}
}
}
}
public class SynFuncationLockDemo {
public static void main(String[] args) throws InterruptedException {
Ticket1 tm = new Ticket1();
Thread t1=new Thread(tm);
Thread t2=new Thread(tm);
t1.start();
t2.start();
}
}
同步函数中使用的锁是this 同步函数和同步代码块的区别是:同步函数的锁是固定的this,同步代码块中的锁是任意的对象
静态同步函数中使用的同步锁是该函数所属的字节码文件对象,用getClass方法获取,或者用当前类名.class获取。
java----线程篇的更多相关文章
- Java线程专栏文章汇总(转)
原文:http://blog.csdn.net/ghsau/article/details/17609747 JDK5.0之前传统线程 Java线程(一):线程安全与不安全 Java线程 ...
- Java线程专栏文章汇总
转载自 http://blog.csdn.net/ghsau/article/details/17609747 JDK5.0之前传统线程 Java线程(一):线程安全与不安全 J ...
- java线程系列之三(线程协作)
本文来自:高爽|Coder,原文地址:http://blog.csdn.net/ghsau/article/details/7433673,转载请注明. 上一篇讲述了线程的互斥(同步),但是在很多情况 ...
- JAVA技术专题综述之线程篇(1)
本文详细介绍JAVA技术专题综述之线程篇 编写具有多线程能力的程序经常会用到的方法有: run(),start(),wait(),notify(),notifyAll(),sleep(),yield( ...
- Java面试知识点之线程篇(三)
前言:这里继续对java线程相关知识点进行总结,不能间断. 1.yield()方法 yield()的作用是让步.它能让当前线程由“运行状态”进入到“就绪状态”,从而让其它具有相同优先级的等待线程获取执 ...
- Java面试知识点之线程篇(二)
前言:接上篇,这里继续对java线程相关知识点进行总结. 1.notify和notifyall的区别 notify()方法能够唤醒一个正在等待该对象的monitor的线程,当有多个线程都在等待该对象的 ...
- Java面试知识点之线程篇(一)
前言:在Java面试中,一定会遇到线程相关问题,因此笔者在这里总结Java中有关线程方面知识点,多数从网上得来(文中会贴出主要参考链接),有些也是笔者在面试中所遇到的问题,如有错误,请不吝指正.主要参 ...
- 8成以上的java线程状态图都画错了,看看这个-图解java并发第二篇
本文作为图解java并发编程的第二篇,前一篇访问地址如下所示: 图解进程线程.互斥锁与信号量-看完还不懂你来打我 图形说明 在开始想写这篇文章之前,我去网上搜索了很多关于线程状态转换的图,我惊讶的发现 ...
- 深入浅出Java线程池:源码篇
前言 在上一篇文章深入浅出Java线程池:理论篇中,已经介绍了什么是线程池以及基本的使用.(本来写作的思路是使用篇,但经网友建议后,感觉改为理论篇会更加合适).本文则深入线程池的源码,主要是介绍Thr ...
- Java线程池详解,看这篇就够了!
构造一个线程池为什么需要几个参数?如果避免线程池出现OOM?Runnable和Callable的区别是什么?本文将对这些问题一一解答,同时还将给出使用线程池的常见场景和代码片段. 基础知识 Execu ...
随机推荐
- struts2.1笔记04:struts2优点
- js中replace的用法【转】
1.replace方法的语法是:stringObj.replace(rgExp, replaceText) 其中stringObj是字符串(string),reExp可以是正则表达式对象(RegExp ...
- Captcha生成及使用
@Controller @RequestMapping("/PictureCheckCode") public class ServletController { @Request ...
- php 发送邮件
php我们可以使用系统的mail函数去发送邮件 但是需要配置一下邮件环境 这里选择使用PHPMailer 这样比较方便 首先下载PHPMailer:https://github.com/Synchr ...
- linux - 文件查找及压缩
文件查找: 1. which 查找可以执行文件,只搜索$PATH里的目录 $ which ls /bin/ls which只搜索$PATH里的目录,如果搜索当前目录的文件是没有任何结果的 $ ...
- linux高可用集群(HA)原理详解(转载)
一.什么是高可用集群 高可用集群就是当某一个节点或服务器发生故障时,另一个 节点能够自动且立即向外提供服务,即将有故障节点上的资源转移到另一个节点上去,这样另一个节点有了资源既可以向外提供服务.高可用 ...
- 有关java.lang.UnsupportedClassVersionError: Unsupported major.minor version 51.0
时常会遇到java.lang.UnsupportedClassVersionError: Unsupported major.minor version 51.0这样的异常,现在都知道是jdk版本的问 ...
- Python基础复习_Unit one
一. 编译&&安装Python2.7 1.安装python第三方模块管理工具 easy_install --->> easy_install-2.7 pip Ipy ...
- html的标签中 unselectable=on 属性的作用
在IE浏览器中,当input获得焦点时,点击有unselectable="on"属性的标签时,不会触发onblur事件. 加上该属性的元素不能被选中. < !DOCTYPE ...
- hdu 4642 博弈
思路:不管是Alice,还是Bob,每次操作都会影响最右下角的数,那么如果是1,Alice赢,否则Bob赢 #include<iostream> #include<cstdio> ...