线程总结(二)

线程同步:用来协调多个线程访问同一资源


/*
* 线程同步的例子
*
*/
public class Test {
public static void main(String[] args) {
//创建两个线程并执行同一条语句
Run r=new Run();
Thread t1=new Thread(r,"t1");
Thread t2=new Thread(r,"t2");
t1.start();
t2.start();

}
}

class Run implements Runnable{
Timer t=new Timer();

//两个开始的线程调用同一个类中的方法
public void run(){
t.add(Thread.currentThread().getName());
}
}

class Timer{

int num=0; //计数
Thread t=new Thread();
//当第一个线程执行完计数,睡眠1ms时,第二个线程开始执行计数并睡眠1ms,然后第一个线程打印,
//接着第二个线程打印,打印时计数以累加到2.
public void add(String ThreadName){
num++;
try {
t.sleep(1);
} catch (InterruptedException e) { }
System.out.println(ThreadName+"第"+num+"次执行");
}

}

对象互斥锁:每个对象对应一个称为互斥锁的标记,这个标记保证在任何时刻,只有一个线程访问该对象。

当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。


/*
* 避免线程同步。
*
*/
public class Test {
public static void main(String[] args) {
//创建两个线程并执行同一条语句
Run r=new Run();
Thread t1=new Thread(r,"t1");
Thread t2=new Thread(r,"t2");
t1.start();
t2.start();

}
}

class Run implements Runnable{
Timer t=new Timer();

//两个开始的线程调用同一个类中的方法
public void run(){
t.add(Thread.currentThread().getName());
}
}

class Timer{

int num=0; //计数
Thread t=new Thread();
public synchronized void add(String ThreadName){
//通过关键字synchronized,在执行方法的过程中锁定当前对象。
// synchronized (this){
num++;
try {
t.sleep(1);
} catch (InterruptedException e) { }
System.out.println(ThreadName+"第"+num+"次执行");
//}
}

}

死锁:线程A锁住了对象a,线程B锁住了对象b。而线程A需要对象b才能继续执行

线程B需要对象a才能继续执行


/*
* 线程死锁
*
*/
public class Test {
public static void main(String[] args) {
//创建两个线程执行不同语句
Run r1=new Run();
Run r2=new Run();
r1.flag=1;
r2.flag=0;
Thread t1=new Thread(r1);
Thread t2=new Thread(r2);
t1.start();
t2.start();

}
}

class Run implements Runnable{

int flag=1; //通过flag的值区分两个不同线程执行的不同操作
static Object o1=new Object(),o2=new Object();

//flag==1的线程无法得到o2,flag==0的线程无法得到o1,进入死锁状态
public void run(){
System.out.println("flag="+flag);
//flag==1的线程先锁住o1,在锁o2
if(flag==1){
synchronized(o1){
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
synchronized(o2){
System.out.println("1");
}
}
}
//flag==1的线程先锁住o2,在锁o1
if(flag==0){
synchronized(o2){
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
synchronized(o1){
System.out.println("0");
}

}
}
}
}

尽量只锁定一个对象

一个方法执行后一个线程锁定了一个对象,另一个线程可以访问未锁定对象的方法


/*
* 线程死锁
*
*/
public class Test {
public static void main(String[] args) {
//创建一个线程执行语句
Run r=new Run();
Thread t=new Thread(r);
t.start();

//使线程锁定run()
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
r.getb();

}
}

class Run implements Runnable{
int b=100;

public void run(){
synchronized(this){
b=1000;
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("runner:b="+b);
}
}

public void getb(){
System.out.println("m2:b="+b);
}

}

一个方法执行后一个线程锁定了一个对象,另一个线程不可以访问另一个锁定对象的方法,只有当先执行的方法执行完后,另一个线程才可以访问另一个锁定对象的方法


/*
* 线程死锁
*
*/
public class Test {
public static void main(String[] args) {

Run r=new Run();
Thread t=new Thread(r);
t.start();

try {
Thread.sleep(8000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

r.m2();
System.out.println(r.b);

}
}

class Run implements Runnable{
int b=100;

public synchronized void m1(){
b=1000;

try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void run(){
m1();
System.out.println("runner:b="+b);

}

public synchronized void m2(){
b=2000;
System.out.println("m2:b="+b);
}
}

线程总结(二)

时间: 2024-10-16 12:21:05

线程总结(二)的相关文章

C++11线程指南(二)--Lambda线程实现

1. Thread with lambda function 基于前一章中的Lambda程序,我们进行了扩展,当前创建5个线程. #include<iostream> #include<thread> #include<vector> #include<algorithm> int main() { std::vector<std::thread> threadVec; for(int i=0; i<5; ++i){ threadVec.p

python基础-------进程线程(二)

Python中的进程线程(二) 一.python中的"锁" 1.GIL锁(全局解释锁) 含义: Python中的线程是操作系统的原生线程,Python虚拟机使用一个全局解释器锁(Global Interpreter Lock)来互斥线程对Python虚拟机的使用.为了支持多线程机制,一个基本的要求就是需要实现不同线程对共享资源访问的互斥,所以引入了GIL.GIL:在一个线程拥有了解释器的访问权之后,其他的所有线程都必须等待它释放解释器的访问权,即使这些线程的下一条指令并不会互相影响.在

C# 线程(二):关于线程的相关概念

From : http://kb.cnblogs.com/page/42528/ 什么是进程? 当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资源. 而一个进程又是由多个线程所组成的. 什么是线程? 线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针.程序计数器等),但代码区是共享的,即不同的线程可以执行同样的函数. 什么是多线程? 多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务,也就是说允许单个程序创建

Handler与线程通信(二)

1. 准备Looper对象 2. 在WorkerThread当中生成Handler对象 3. 在MainThread当中发送消息 这个过程与上一篇相反 由MainThread里面的Handler发送消息, WorkerThread里面的HandlerMessage来处理 Handler与线程通信(二)

进程与线程(二) java进程的内存模型

从我出生那天起,我就知道我有个兄弟,他桀骜不驯,但实力强悍 ,人家都叫它C+++            ----java 上回说到了,C进程的内存分配,那么一个java运行过程也是一个进程,java内存是如何分配的呢? http://blog.csdn.net/shimiso/article/details/8595564 详情请看:http://blog.csdn.net/a859522265/article/details/7282817 1.学习java,学过java多线程,没有学过多进程

C#中的线程(二)线程同步

C#中的线程(二)线程同步 Keywords:C# 线程Source:http://www.albahari.com/threading/Author: Joe AlbahariTranslator: Swanky WuPublished: http://www.cnblogs.com/txw1958/Download:http://www.albahari.info/threading/threading.pdf 第二部分:线程同步基础 同步要领 下面的表格列展了.NET对协调或同步线程动作的

线程篇(二)

C# 温故而知新: 线程篇(二) 线程池和异步线程 目录: 1 什么是CLR线程池? 2 简单介绍下线程池各个优点的实现细节 3 线程池ThreadPool的常用方法介绍 4 简单理解下异步线程 5 异步线程的工作过程和几个重要的元素 6 有必要简单介绍下Classic Async Pattern 和Event-based Async Pattern 7 异步线程的发展趋势以及.net4.5异步的简化 8 本章示例 自定义一个简单的线程池 Asp.net异步IHttpAsyncHandler示例

java之线程(二)创建和启动

线程的创建有三种方法:一是继承Thread类创建线程,二是实现Runnable接口,三是使用Callable和Future创建线程. 继承Thread类创建线程 步骤: 定义Thread子类,并重写该类的run方法,run方法代表将要完成的任务,也就是线程执行体 创建Thread实例 调用Thread子类的start()方法启动线程 1 public class ThreadTest extends Thread{ 2 3 private int i; 4 5 public void run()

pthread_attr_t 线程属性(二)

一.函数: 1.线程属性的初始化与销毁:#include <pthread.h>int pthread_attr_init(pthread_attr_t *attr);int pthread_attr_destroy(pthread_attr_t   *attr);Both return: 0 if OK, error number on failure2.设置线程属性--detackstate(分离状态):#include <pthread.h>int pthread_attr_