day12/InputOutputDemo.java

/*
线程间通讯:
其实就是多个线程在操作同一个资源,
但是操作的动作不同。

需求:一个线程负责输入姓名和年龄,另一个线程负责输出这个姓名和年龄。

加锁了,多线程还不安全就要考虑两个前提是否满足。
1、多线程。
2、同一个锁。

*/

class Resource
{
	String name;
	String sex;
}

class Input implements Runnable
{
	private Resource r;
	Input(Resource r)
	{
		this.r = r;
	}

	public void run()
	{
		int x=0;
		while(true)
		{
			synchronized(r)//两个线程,加同一个锁
			{
				if(x==0)
				{
					r.name="mike";
					r.sex="man";
				}
				else
				{
					r.name="丽丽";
					r.sex="女女女女女";
				}
				x=(x+1)%2;
			}
		}
	}
}

class Output implements Runnable
{
	private Resource r;
	Output(Resource r)
	{
		this.r = r;
	}

	public void run()
	{
		while(true)
			synchronized(r)//两个线程,加同一个锁
			{
				System.out.println(r.name+"..."+r.sex);
			}
	}
}

class InputOutputDemo 
{
	public static void main(String[] args) 
	{
		Resource r = new Resource();

		Input in = new Input(r);
		Output out = new Output(r);

		Thread t1 = new Thread(in);
		Thread t2 = new Thread(out);

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

/*
E:\javademo\day12>java InputOutputDemo
mike...man
mike...man
mike...man
mike...man
mike...man
mike...man
mike...man
mike...man
mike...man
mike...man
mike...man
mike...man
mike...man
mike...man
mike...man
mike...man
mike...man
mike...man
丽丽...女女女女女
丽丽...女女女女女
丽丽...女女女女女
丽丽...女女女女女
*/

org.junit.platform.commons.PreconditionViolationException: Classpath resource [/nextDay.csv] does not exist at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:215) at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1709) at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:570) at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:560) at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:151) at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:174) at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:265) at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:636) at java.base/java.util.stream.ReferencePipeline$7$1FlatMap.accept(ReferencePipeline.java:294) at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:215) at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:215) at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:215) at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1709) at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:570) at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:560) at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:151) at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:174) at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:265) at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:636) at java.base/java.util.stream.ReferencePipeline$7$1FlatMap.accept(ReferencePipeline.java:294) at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1709) a
03-24
### 解决方案 当遇到 `PreconditionViolationException` 错误提示 `Classpath resource nextDay.csv does not exist` 时,通常是因为 JUnit 测试框架无法找到指定的资源文件。以下是可能的原因分析以及对应的解决方案: #### 可能原因 1. **路径错误**:资源文件未放置在正确的目录下。 2. **构建工具配置问题**:如果使用 Maven 或 Gradle 构建项目,则可能是这些工具未能正确加载资源文件到目标路径。 3. **编码方式不匹配**:某些情况下,读取 CSV 文件的方式可能导致异常。 --- #### 解决方法 ##### 方法一:确认资源文件位置 确保 `nextDay.csv` 被放在项目的 `src/main/resources` 或者 `src/test/resources` 目录下[^5]。这是标准的 Java 项目结构,Maven 和 Gradle 默认会将这两个目录下的文件复制到最终的 classpath 中。 ```java // 使用 ClassLoader 加载资源文件 InputStream inputStream = getClass().getClassLoader().getResourceAsStream("nextDay.csv"); if (inputStream == null) { throw new RuntimeException("Resource file 'nextDay.csv' is missing!"); } ``` 上述代码通过 `ClassLoader` 动态获取资源文件流并验证其是否存在。 --- ##### 方法二:检查构建工具配置 如果是基于 Maven 的项目,请确保 `pom.xml` 配置正常加载资源文件。默认情况下无需额外设置,但如果自定义了 `<build>` 部分则需注意以下内容: ```xml <build> <resources> <resource> <directory>src/main/resources</directory> <includes> <include>**/*.csv</include> </includes> </resource> </resources> </build> ``` 对于 Gradle 用户,在 `build.gradle` 中可以这样声明资源文件夹: ```gradle sourceSets { main { resources.srcDirs = ['src/main/resources'] } } ``` --- ##### 方法三:动态创建缺失文件(仅用于调试) 如果确实需要临时解决该问题而不想修改实际部署环境中的文件管理逻辑,可以在测试运行前自动创建所需的资源文件: ```java @BeforeAll public static void setup() throws IOException { Path path = Paths.get(ClassLoader.getSystemResource("").toURI()).resolve("nextDay.csv"); Files.write(path, "Sample content".getBytes(StandardCharsets.UTF_8)); } ``` 此片段利用了 JUnit 5 提供的 `@BeforeAll` 注解来初始化必要的数据文件。 --- ##### 方法四:调整单元测试策略 考虑是否真的有必要绑定具体的数据文件来进行测试?有时可以通过模拟器替代真实外部依赖项达到相同效果而不必担心物理存储介质的存在与否问题。例如借助 Mockito 库伪造行为: ```java @Test void testWithMockitoWithoutFileDependency() { // Arrange List<String[]> mockCsvContent = Arrays.asList(new String[][]{{"Header", "Value"}}); PowerMockito.mockStatic(CsvUtils.class); when(CsvUtils.readFromCSV(any(InputStream.class))).thenReturn(mockCsvContent); // Act & Assert... } ``` 以上例子展示了如何用静态方法拦截技术规避直接访问磁盘上的 `.csv` 文档的需求。 --- ### 总结 综上所述,要彻底消除由于丢失 `'nextDay.csv'` 所引发的预条件违规例外状况,可以从以下几个方面入手——核实文档所在确切地点;审查自动化装配脚本设定无误;必要时候采取编程手段即时生成所缺物件;最后重新评估整个测验流程设计思路看能否减少对外部实体资料库的信赖程度从而提升灵活性与可移植性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值