写2个线程,一个打印1-52,一个打印A-Z,打印顺序是12A34B。。。(采用同步代码块和同步方法两种同步方法)

1.同步方法

package Synchronized;
/************************************同步方法****************************************/
public class PrintTest {
	public static void main(String[] args)
	{
		Print p = new Print();
		Thread t1 = new PrintNumber(p);
		Thread t2 = new PrintWord(p);
		t1.start();
		t2.start();
	}
}

class PrintNumber extends Thread {//打印数字线程
	private Print p;

	public PrintNumber(Print p) {
		this.p = p;
	}

	public void run() {
		for (int i = 0; i < 26; i++) {
			p.printNumber();
		}
	}
}

class PrintWord extends Thread {//打印字母线程
	private Print p;

	public PrintWord(Print p) {
		this.p = p;
	}

	public void run() {
		for (int i = 0; i < 26; i++) {
			p.printWord();
		}
	}
}

class Print {             //同步监视器是Print类
	private int i = 1;
	private char j = ‘A‘;

	public Print() {
	}

	public synchronized void printNumber() {//同步方法
		System.out.print(String.valueOf(i) + String.valueOf(i + 1));
		i += 2;
		notifyAll();      //先唤醒其他进程,再阻塞本进程,如果顺序颠倒了,进程阻塞后不能再唤醒其他进程
		try {
			wait();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}

	public synchronized void printWord() {
		System.out.print(j);
		j++;
		notifyAll();
		try
		{
			if (j <= ‘Z‘)//输出Z之后就不用再等待了。
			{

				wait();
			}
		}
		catch (InterruptedException e) {
			e.printStackTrace();
		}

	}
}

2.同步代码块package threaddemo;


/**
 * <写两个线程,一个线程打印1-52,另一个线程打印字母A-Z。打印 顺序为12A34B56C……5152Z>
 *
 *//*****************************************同步代码块*********************************************/
public class ThreadDemo
{
    // 测试
    public static void main(String[] args) throws Exception
    {
        Object obj = new Object();
        // 启动两个线程
        Thread1 t1 = new Thread1(obj);

        Thread2 t2 = new Thread2(obj);

        t1.start();
        t2.start();
    }

}

// 一个线程打印1-52
class Thread1 extends Thread
{
    private Object obj;

    public Thread1(Object obj)
    {
        this.obj = obj;
    }

    public void run()
    {
        synchronized (obj)
        {
            // 打印1-52
            for (int i = 1; i < 53; i++)
            {
                System.out.print(i + " ");
                if (i % 2 == 0)
                {
                    // 不能忘了 唤醒其它线程
                    obj.notifyAll();
                    try
                    {
                        obj.wait();
                    }
                    catch (InterruptedException e)
                    {
                        e.printStackTrace();
                    }
                }
            }
        }

    }

}

// 另一个线程打印字母A-Z
class Thread2 extends Thread
{
    private Object obj;

    public Thread2(Object obj)
    {
        this.obj = obj;
    }

    public void run()
    {
        synchronized (obj)             //同步监视器是obj类,同步代码块是写在run方法里面的。
        {
            // 打印A-Z
            for (int i = 0; i < 26; i++)
            {
                System.out.print((char)(‘A‘ + i) + " ");
                // 不能忘了 唤醒其它线程
                obj.notifyAll();
                try
                {
                    // 最后一个就不要等了
                    if (i != 25)
                    {
                        obj.wait();
                    }
                }
                catch (InterruptedException e)
                {
                    e.printStackTrace();
                }

            }

        }
    }

}
时间: 2024-11-06 15:03:40

写2个线程,一个打印1-52,一个打印A-Z,打印顺序是12A34B。。。(采用同步代码块和同步方法两种同步方法)的相关文章

JAVA之旅(十三)——线程的安全性,synchronized关键字,多线程同步代码块,同步函数,同步函数的锁是this

JAVA之旅(十三)--线程的安全性,synchronized关键字,多线程同步代码块,同步函数,同步函数的锁是this 我们继续上个篇幅接着讲线程的知识点 一.线程的安全性 当我们开启四个窗口(线程)把票陆陆续续的卖完了之后,我们要反思一下,这里面有没有安全隐患呢?在实际情况中,这种事情我们是必须要去考虑安全问题的,那我们模拟一下错误 package com.lgl.hellojava; import javax.security.auth.callback.TextInputCallback

Java---13---多线程:解决多线程的安全问题---synchronized 同步代码块

还是之前卖票的例子: class Test implements Runnable { private int num = 50; Object obj = new Object(); public void run () { while (true) { if (num >= 0) { try { Thread.sleep(20); } catch (Exception e) { // TODO: handle exception System.out.println(e.toString()

线程的同步机制:同步代码块&amp;同步方法

解决存在的线程安全问题:打印车票时出现重票,错票 使用同步代码块的解决方案 TestWindow2 package com.aff.thread; /* 使用实现Runnable接口的方式,售票 存在线程安全问题: 打印车票时出现重票,错票 1.原因:由于一个线程在操作共享数据过程中,未执行完毕的情况下, 另外的线程参与进来了,导致共享数据存在了安全问题 2.解决想法:让一个线程操作共享数据完毕后,其他进程才有机会参与共享数据的使用 3.java的解决方案: 线程的同步机制 方式一:同步代码块

Java线程安全与同步代码块

因为在电商网站工作的原因,对于秒杀.闪购等促销形式相当熟悉.无外乎商家拿出一定量的库存去做所谓的"亏本买卖",其目的是用有限的库存去吸引无限的流量.然而,我却碰到过因为系统问题,导致秒杀品超卖的情况.可怜的商户其实只提供了10双9.9元的童鞋做秒杀,却在瞬间内卖出了1000双! 类似这样的问题,在非线程安全的程序设计中十分常见,我们下面运行一个秒杀的程序: public class SalesThread implements Runnable { private int stock

彻底理解线程同步与同步代码块synchronized

1 public class Demo { 2 public static synchronized void fun1(){ 3 } 4 public synchronized void fun2(){ 5 } 6 public static void main(String args[]) throws Exception{ 7 synchronized(xxx) { 8 9 } 10 } 11 } 三种同步类型 虽然写法不同,但实际上,只有一种,就是[同步代码块].这是核心核心核心.同步方

java中使用wait就得使用同步锁,而且2个线程必须都使用同步代码块,否则就会异常

标题已经说明,子线程wai()时候默认的锁不是同步代码块的锁,因此wai时候显示的指明锁,现在解释看code: public class Test { // static boolean flag=true; public static void main(String[] args) throws InterruptedException { Zp z=new Zp(); Thread st=new Thread(z); st.start(); for(int x=0;x<100000;x++

阶段1 语言基础+高级_1-3-Java语言高级_05-异常与多线程_第3节 线程同步机制_4_解决线程安全问题_同步代码块

同步代码块 解决了线程安全的问题. 原文地址:https://www.cnblogs.com/wangjunwei/p/11260470.html

多线程之:线程同步代码块

java中使用关键字synchronized进行线程同步,有四中同步块: 1.实例方法 2.静态方法 3.实例方法中的同步块 4.静态方法中的同步块 实例方法同步:在方法申明中使用synchronized 关键字,同步在拥有该方法的对象上 1 public synchronized void increase(){ 2 this.id++; 3 } 静态方法同步:与实例方法同步一样,在方法申明中使用synchronized 关键字,同步在拥有该方法的类对象上,同时只允许一个线程执行同一个类中的静

java线程同步--同步代码块

package com.LearnJava.Thread; /* 同步代码块 synchronized(同步监视器){ //需要同步的代码 } 同步监视器:俗称 锁,可以是任何实例化的类.但是需要共用同一个实例. */ class WindowSell implements Runnable{ Object obj = new Object(); private int ticket = 100; @Override public void run() { while (true) { sync